黑马程序员技术交流社区
标题: 【成都校区】 [打印本页]
作者: 没有退路 时间: 2019-10-10 12:06
标题: 【成都校区】
本帖最后由 没有退路 于 2019-10-10 12:11 编辑
1Socket简介
Socket原理:
Socket:通常称为套接字,用于描述IP地址和端口,是一个通信连的句柄。在internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务。
应用程序网络通信原理:通常通过套接字向网络发出请求或者应答网络请求。Socket和ServerSocket类位于java.net包中。ServerSocket位于服务端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会生成一个Socket实例,操作这个实例,完成所需对话。
网络编程分类:
java.net 包中提供了两种常见的网络协议的支持:
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
2TCP通信模型和编程
TCP通信模型(客户端和服务端通信):
TCP编程的核心类(ServerSocket和Socket):
ServerSocket类:
服务器应用程序通过使用 java.net.ServerSocket 类以获取一个端口,并且侦听客户端请求。常用方法如下:
方法名 | |
| |
ServerSocket(int port, int backlog, InetAddress address) | 构造函数:使用指定的端口、侦听和要绑定到的本地 IP 地址创建服务器。 |
| |
| |
void setSoTimeout(int timeout) | 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位 |
void bind(SocketAddress host, int backlog) | 将 ServerSocket 绑定到特定地址(IP 地址和端口号) |
Socket类:
java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。常用方法如下:
方法名 | |
Socket(String host, int port) | 构造函数:创建一个流套接字并将其连接到指定主机上的指定端口号 |
Socket(InetAddress host, int port) | 构造函数:创建一个流套接字并将其连接到指定 IP 地址的指定端口号 |
void connect(SocketAddress host, int timeout) | |
InetAddress getInetAddress() | |
| |
| |
SocketAddress getRemoteSocketAddress() | 返回此套接字连接的端点的地址,如果未连接则返回 null |
InputStream getInputStream() | |
OutputStream getOutputStream() | |
| |
TCP网络编程模型:
TCP编程实例:
服务端代码:
package com.example.socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TestTcpServer {
public static void main(String[] args) {
try {
ServerSocket listen = newServerSocket(3333);
Socket server = listen.accept();
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
byte[] content = new byte[30];
in.read(content);
System.out.println("服务端收到:" + new String(content));
String sendInfo = "No Problem!";
out.write(sendInfo.getBytes());
out.close();
in.close();
server.close();
listen.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端代码:
package com.example.socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TestTCPClient {
public static void main(String[] args) {
try {
Socket client = newSocket("127.0.0.1" , 3333);
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
String content = "hello,world!";
out.write(content.getBytes());
byte[] receiveInfo = newbyte[30];
in.read(receiveInfo);
System.out.println("客户端收到:" + new String(receiveInfo));
out.close();
in.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3UDP通信模型和编程编程
UDP通信模型(客户端和服务端通信):
UDP编程的核心类(DatagramSocket和DatagramPacket):
DatagramSocket类:
此类表示用来发送和接收数据报包的套接字。常用方法如下:
方法 | |
| 构造函数:构造数据报套接字并将其绑定到本地主机上任何可用端口 |
| 构造函数:创建数据报套接字并将其绑定到本地主机上的指定端口。 |
DatagramSocket(int port, InetAddress laddr) | 构造函数:创建数据报套接字,将其绑定到指定的本地地址。 |
void receive(DatagramPacket p) | |
void send(DatagramPacket p) | |
| |
DatagramPacket类:
此类表示数据报包。常用方法如下:
方法 | |
DatagramPacket (byte[] buf, int length) | 构造函数:构造 DatagramPacket,用来接收长度为 length 的数据包。 |
DatagramPacket (byte[] buf, int length, InetAddress address, int port) | 构造函数:构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 |
| 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 |
| |
| |
| 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 |
UDP网络编程模型:
UDP编程实例:
服务端代码:
package com.example.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class TestUDPServer {
public static void main(String[] args){
try {
DatagramSocket server = newDatagramSocket(6666);
byte[] recvBuf = new byte[30];
DatagramPacket recvPacket = newDatagramPacket(recvBuf , recvBuf.length);
server.receive(recvPacket);
String recvStr = newString(recvPacket.getData() , 0 , recvPacket.getLength());
System.out .println("服务端收到: " + recvStr);
int port = recvPacket.getPort();
InetAddress addr = recvPacket.getAddress();
String sendStr = "UDPsever send content";
byte[] sendBuf;
sendBuf = sendStr.getBytes();
DatagramPacket sendPacket = newDatagramPacket(sendBuf , sendBuf.length , addr , port );
server.send(sendPacket);
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端代码:
package com.example.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class TestUDPClient {
public static void main(String[] args){
try {
DatagramSocket client = newDatagramSocket();
String sendStr = "UDPClient send content";
byte[] sendBuf;
sendBuf = sendStr.getBytes();
InetAddress addr = InetAddress.getByName("127.0.0.1");
int port = 6666;
DatagramPacket sendPacket = newDatagramPacket(sendBuf ,sendBuf.length , addr , port);
client.send(sendPacket);
byte[] recvBuf = new byte[30];
DatagramPacket recvPacket = newDatagramPacket(recvBuf , recvBuf.length);
client.receive(recvPacket);
String recvStr = newString(recvPacket.getData() , 0 ,recvPacket.getLength());
System.out .println("客户端收到: " + recvStr);
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |