一、基础
OSI 参考模型 TCP/IP参考模型 (软件开发常涉及到的)
应用层 应用层 (应用程序)
表示层 传输层 (TCP/UDP层)
会话层 网络层 (IP层)
传输层 物理层+数据链路层
网络层
数据链路层
物理层
数据封装:从上到下,将数据封装成为电信号
数据拆封:另一台机器接收电信号,从下到上,一层一层解释,最后接收到数据
二、TCP和UDP协议
TCP:是一种面向连接,可靠的通信协议,连接时需要三次握手 可靠但速度慢
UDP:无需建立连接,是一种不可靠的连接 不可靠但速度快
三、Socket
(1)两台机器通过socket进行通信,双向链路的一端成为socket
(2)Socket通常实现client-server连接
(3)java.net包内定义了Socket类和ServerSocket类,分别实现双向连接的client端和Server端
(4)建立连接时所需要的寻址信息为远程计算机的IP和端口号
端口号:用来区别同一机器的不同应用程序,有65536个,一般不要选1024以下,系统随时会征用
注意:TCP端口和UDP端口是分开的,每一个有65536个端口
四、TCP Socket通信模型
Server Client
ServerSocket s (port) Socket(host,port)
s.accept() /等待连接
|->Socket对象
---------------------------------------------
OutputStream OutputStream 对角线
InputStream InputStream
---------------------------------------------
Socket.close() Socket.close()
五、常用方法
accept():服务器端如果接收客户端请求,会生成一个新的socket,进行连接,是阻塞式的
getInputStream、getOutputStream:获得流
六、UDP
发送数据时是发送的数据包
服务端:DatagramPacket DatagramSocket
通过receive接收包
客户端:DatagramPacket DatagramSocket
OSI 参考模型 TCP/IP参考模型 (软件开发常涉及到的)
应用层 应用层 (应用程序)
表示层 传输层 (TCP/UDP层)
会话层 网络层 (IP层)
传输层 物理层+数据链路层
网络层
数据链路层
物理层
数据封装:从上到下,将数据封装成为电信号
数据拆封:另一台机器接收电信号,从下到上,一层一层解释,最后接收到数据
二、TCP和UDP协议
TCP:是一种面向连接,可靠的通信协议,连接时需要三次握手 可靠但速度慢
UDP:无需建立连接,是一种不可靠的连接 不可靠但速度快
三、Socket
(1)两台机器通过socket进行通信,双向链路的一端成为socket
(2)Socket通常实现client-server连接
(3)java.net包内定义了Socket类和ServerSocket类,分别实现双向连接的client端和Server端
(4)建立连接时所需要的寻址信息为远程计算机的IP和端口号
端口号:用来区别同一机器的不同应用程序,有65536个,一般不要选1024以下,系统随时会征用
注意:TCP端口和UDP端口是分开的,每一个有65536个端口
四、TCP Socket通信模型
Server Client
ServerSocket s (port) Socket(host,port)
s.accept() /等待连接
|->Socket对象
---------------------------------------------
OutputStream OutputStream 对角线
InputStream InputStream
---------------------------------------------
Socket.close() Socket.close()
五、常用方法
accept():服务器端如果接收客户端请求,会生成一个新的socket,进行连接,是阻塞式的
getInputStream、getOutputStream:获得流
六、UDP
发送数据时是发送的数据包
服务端:DatagramPacket DatagramSocket
通过receive接收包
客户端:DatagramPacket DatagramSocket
通过send发送包
下面分别是TCP和UDP的代码
TCP服务端
public class TestServer {
public static void main(String[] args) {
try {
ServerSocket s = new ServerSocket(8888);
while(true){
Socket s1 = s.accept();
DataOutputStream dos = new DataOutputStream(s1.getOutputStream());
dos.writeUTF("hello:"+s1.getInetAddress()+"port:"+s1.getPort()+" BYEBYE");
dos.close();
s1.close();
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("程序运行出错!!");
}
}
}
TCP客户端
public class TestClient {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1", 8888);
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
dis.close();
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("服务器连接失败!!!");
e.printStackTrace();
}
}
}
UDP服务端
public class TestUDPServer {
public static void main(String[] args) throws Exception{
byte buf [] = new byte [1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
DatagramSocket ds = new DatagramSocket(5678);
while(true){
ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readLong());
}
}
}
UDP客户端
public class TestUDPClient {
public static void main(String[] args) throws Exception {
/*long转换为字节数组*/
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(10000L);
byte buf [] = baos.toByteArray();
DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1", 5678));
DatagramSocket ds = new DatagramSocket(9999);
ds.send(dp);
ds.close();
}
}