TCP/IP分层
应用层 传输层 网络层 物理+数据链路层
每段都不超过255,有四个字节表示ip地址,每个字节取值范围0-255
1)IP提供了独一五二的IP地址
2)TCP可靠 慢
3)UDP不可靠 快
TCP端口与UDP端口是分开的,每个有65536个端口
先启动sever再启动client
TCP
import java.net.*;
import java.io.*;
public class TCPSe {//插座,可插多个Client
public static void main(String[] args)throws Exception {
ServerSocket ss = new ServerSocket(6666);//在6666端口接听客户端连接,不能再次启动此端口的Sever,除非此Sever退出
Socket s = ss.accept();//接收连接,accpet次数根据Client数量而定(阻塞式)
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());//readUTF()阻塞式,
//只有执行完,才会执行别的,不管是否等待
dis.close();
s.close();//由里到外关
}
}
import java.net.*;
import java.io.*;
public class TCPCl {
public static void main(String[] args)throws Exception {
Socket s = new Socket("127.0.0.1",6666);//指定本机ip,要连接的(Sever的)端口(申请连接)
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("HELLO");
dos.flush();
dos.close();
s.close();
}
}
UDP
DatagramPacket以 包 装数据传输,
byte buf[] = new byte[1024];//造包裹用来存数据
DatagramPacket dp = new DatagramPacket(buf, buf.length);//接收数据,存在buf内,长度n
DatagramSocket ds = new DatagramSocket(5678);//放包裹位置
while(true)
{
ds.receive(dp);//接收数据扔进包袱
DatagramPacket dp = new DatagramPacket(buf, buf.length,
new InetSocketAddress("127.0.0.1", 5678)
);//接收包裹,注明包裹所在ip,所发端口
DatagramSocket ds = new DatagramSocket(9999);//指明客户端占据端口
ds.send(dp);//发出
ds.close();