编程语言
首页 > 编程语言> > 网络编程:Socket的使用和方法

网络编程:Socket的使用和方法

作者:互联网

TCP

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

JAVA Socket

所谓socket 通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

重要的Socket API

java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。

Accept方法用于产生”阻塞”,直到接受到一个连接,并且返回一个客户端的Socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续;通常”阻塞”是由循环产生的。 getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。 getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。 注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

二、TCP 编程

服务器端套路

创建ServerSocket对象,绑定监听端口。 通过accept()方法监听客户端请求。 连接建立后,通过输入流读取客户端发送的请求信息。 通过输出流向客户端发送响应信息。 关闭响应的资源。 客户端套路

创建Socket对象,指明需要连接的服务器的地址和端口号。 连接建立后,通过输出流向服务器发送请求信息。 通过输入流获取服务器响应的信息。 关闭相应资源。 多线程实现服务器与多客户端之间通信步骤

服务器端创建ServerSocket,循环调用accept()等待客户端连接。 客户端创建一个socket并请求和服务器端连接。 服务器端接受客户端请求,创建socket与该客户建立专线连接。 建立连接的两个socket在一个单独的线程上对话。 服务器端继续等待新的连接。 三、Socket通信基本示例

1、基础模式

这种基础模式,必须掌握,后期对Socket的优化都是在这个基础上的,也是为以后学习NIO做铺垫。

import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;

public class SocketServer { public static void main(String[] args) throws Exception { // 监听指定的端口 int port = 55533; ServerSocket server = new ServerSocket(port);

// server将一直等待连接的到来
System.out.println("server将一直等待连接的到来");
Socket socket = server.accept();
// 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
  //注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
  sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("get message from client: " + sb);
inputStream.close();
socket.close();
server.close();

} } 服务端监听一个端口,等待连接的到来。

import java.io.OutputStream; import java.net.Socket;

public class SocketClient { public static void main(String args[]) throws Exception { // 要连接的服务端IP地址和端口 String host = “127.0.0.1”; int port = 55533; // 与服务端建立连接 Socket socket = new Socket(host, port); // 建立连接后获得输出流 OutputStream outputStream = socket.getOutputStream(); String message=“你好 yiwangzhibujian”; socket.getOutputStream().write(message.getBytes(“UTF-8”)); outputStream.close(); socket.close(); } } 客户端通过ip和端口,连接到指定的server,然后通过Socket获得输出流,并向其输出内容,服务器会获得消息。最终服务端控制台打印如下:

server将一直等待连接的到来 get message from client: 你好 yiwangzhibujian 通过这个例子应该掌握并了解:

Socket服务端和客户端的基本编程 传输编码统一指定,防止乱码 这个例子做为学习的基本例子,实际开发中会有各种变形,比如客户端在发送完消息后,需要服务端进行处理并返回

标签:unix网络编程,socket,数据,网络,基础,编码
来源: