TCP和UDP都是都传输层协议
TCP : 以三次握手的方式进行连接,及甲方向乙方发出连接请求,乙方同意并告知甲方,之后甲方将要传输的类容传输给乙方。
UDP : 以发快递的形式进行连接,及甲方在未告知乙方的情况下直接将传输的类容打包发给乙方,乙方收到传输的类容后不会告知甲方已接收。
TCP因为要连接的原因,所以效率低,但是很安全,UDP因为不需要连接,所以效率高,不安全。
下附代码
public class TCP {
@Test
public void testClient() throws Exception{
String msg ="!!";
Socket s = new Socket("127.0.0.1",10000);
OutputStream os = s.getOutputStream();
os.write(msg.getBytes());
s.shutdownOutput();
InputStream is = s.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] b = new byte[1024];
int len;
while((len=is.read(b))!=-1) {
sb.append(new String(b,0,len));
}
System.out.println("收到回复"+sb.toString());
s.shutdownInput();
s.close();
}
@Test
public void testServer() throws Exception {
ServerSocket ss = new ServerSocket(10000);
while(true) {
Socket socket = ss.accept();
InputStream is = socket.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] b = new byte[1024];
int len;
while((len=is.read(b))!=-1) {
sb.append(new String(b,0,len));
}
System.out.println("收到数据"+sb.toString());
String msg ="??";
socket.shutdownInput();
OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());
socket.shutdownOutput();
socket.close();
}
}
public class UDP {
@Test
public void SendDemo() throws Exception{
DatagramSocket ds = new DatagramSocket();
String src = "123456";
byte[] bys = src.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10001;
DatagramPacket dp = new DatagramPacket(bys,length,address,port);
ds.send(dp);
ds.close();
}
@Test
public void ReceiveDemo() throws Exception{
DatagramSocket ds = new DatagramSocket(10001);
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys,length);
System.out.println(1);
ds.receive(dp);//这里会发生线程阻塞,及线程在运行到这里会停止,直到收到从SendDemo发过来的包再向下运行。
System.out.println(2);
byte[] data = dp.getData();
String str = new String(bys,0,length);
System.out.println(str);
ds.close();
}
}