java中TCP/UDP详细总结
tcp/udp:tcp主要是面向连接的协议,它包含有建立和拆除连接,保证数据流的顺序和正确性等功能。
每次对tcp中间的数据操作相当于对一个数据流进行访问。它最典型的特征就是那三次握手的建立连接过程。server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的处理步骤如下:
1. 构建一个serversocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。
2.重复如下几个步骤:
a. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。
b.通过这个返回的socket实例获取inputstream和outputstream,可以通过这两个stream来分别读和写数据。
c.结束的时候调用socket实例的close()方法关闭socket连接。
tcp服务器端:
public class tcpserver { public static void main(string[] args){ try{ serversocket server=new serversocket(); socketaddress address=new inetsocketaddress(inetaddress.getlocalhost(),10001); server.bind(address); system.out.println("等待连接客户端..."); socket client = server.accept(); system.out.println("connected with"+client.getremotesocketaddress()); printwriter socketout = new printwriter(client.getoutputstream()); system.out.println("等待客户端的消息..."); byte buf[] = new byte[1024]; if ( client.getinputstream().read(buf) > 0 ) { system.out.println("收到的消息: " + new string(buf)); } system.out.println("发送消息给客户端..."); string sendstr = "服务器返回的信息"; socketout.write(sendstr); socketout.flush(); socketout.close(); client.close(); server.close(); }catch (ioexception e) { system.out.println(e.getmessage()); e.printstacktrace(); } } }
tcp客户端:
1.构建socket实例,通过指定的远程服务器地址和端口来建立连接。
2.通过socket实例包含的inputstream和outputstream来进行数据的读写。
3.操作结束后调用socket实例的close方法,关闭。
public class tcpclient { public static void main(string[] args){ try{ final socket socket = new socket(); socketaddress address = new inetsocketaddress(inetaddress.getlocalhost(), 10001); system.out.println("连接服务端 ..."); socket.connect(address); printwriter socketout = new printwriter(socket.getoutputstream()); bufferedreader socketin = new bufferedreader( new inputstreamreader(socket.getinputstream()) ); string sendstr = "客户端发送的消息"; system.out.println("发送消息给服务端 ..."); socketout.write(sendstr); socketout.flush(); system.out.println("等待服务端的消息 ..."); string receivestr = socketin.readline(); system.out.println("收到的消息: " + receivestr); socketout.close(); socketin.close(); socket.close(); }catch (ioexception e) { system.out.println(e.getmessage()); e.printstacktrace(); } } }
udp(user datagram protocol,用户数据报协议)
udp和tcp有两个典型的区别,一个就是它不需要建立连接,另外就是它在每次收发的报文都保留了消息的边界。
因为udp协议不需要建立连接,它的过程如下:
1. 构造datagramsocket实例,指定本地端口。
2. 通过datagramsocket实例的receive方法接收datagrampacket.datagrampacket中间就包含了通信的内容。
3. 通过datagramsocket的send和receive方法来收和发datagrampacket.
public class udpserver { public static void main(string args[]) { datagramsocket socket = null; datagrampacket datapacket = null; inetsocketaddress address = null; try { address = new inetsocketaddress(inetaddress.getlocalhost(), 7778); socket = new datagramsocket(address); // socket.bind(address); byte buf[] = new byte[1024]; datapacket = new datagrampacket(buf, buf.length); system.out.println("block for receive messages..."); socket.receive(datapacket); buf = datapacket.getdata(); inetaddress addr = datapacket.getaddress(); int port = datapacket.getport(); system.out.println("message content: " + new string(buf) ); system.out.println("receive from " + addr + ":" + port); socketaddress toaddress = datapacket.getsocketaddress(); string sendstr = "i'm server, this is the message for client."; buf = sendstr.getbytes(); datapacket = new datagrampacket(buf, buf.length); datapacket.setsocketaddress(toaddress); socket.send(datapacket); system.out.println("message sended"); //释放资源 socket.close(); } catch (unknownhostexception e) { e.printstacktrace(); } catch (socketexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } }
udp客户端的步骤也比较简单,主要包括下面3步:
1. 构造datagramsocket实例。
2.通过datagramsocket实例的send和receive方法发送datagrampacket报文。
3.结束后,调用datagramsocket的close方法关闭。
因为和tcp不同,udp发送报文的时候可以在同一个本地端口随意发送给不同的服务器,一般不需要在udp的datagramsocket
的构造函数中指定目的服务器的地址。
另外,udp客户端还有一个重要的不同就是,tcp客户端发送echo连接消息之后会在调用read方法的时候进入阻塞状态,而udp这样却不行。因为udp中间是可以允许报文丢失的。如果报文丢失了,进程一直在阻塞或者挂起的状态,则进程会永远没法往下走了。
所以会一般设置一个setsotimeout
方法,指定在多久的时间内没有收到报文就放弃。也可以通过指定一个数字,循环指定的次数来读取报文,读到就返回,否则就放弃。
public class udpclient { public static void main(string args[]) { try { datagramsocket getsocket = new datagramsocket(); datagrampacket datapacket = null; inetsocketaddress toaddress = new inetsocketaddress(inetaddress.getlocalhost(), 7778); string sendstr = "i'm client, this is the message for server."; byte buf[] = sendstr.getbytes(); datapacket = new datagrampacket(buf, buf.length); datapacket.setsocketaddress(toaddress); getsocket.send(datapacket); system.out.println("message sended"); system.out.println("block for receive messages..."); getsocket.receive(datapacket); buf = datapacket.getdata(); system.out.println("message content: " + new string(buf)); getsocket.close(); } catch (socketexception e) { e.printstacktrace(); } catch (unknownhostexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } }
以上内容,需要的朋友可以参考