一、ServerSocket和Socket详解
1.1 ServerSocket方法
ServerSocket的构造方法
ServerSocket() //不绑定任何端口
ServerSocket(int port) //绑定一个监听端口
ServerSocket(int port,int backlog) //绑定具体的端口号并且绑定日志
ServerSocket(int port,int backlog,InetAddress bindAddr) //绑定具体的端口号和日志以及本地的IP地址
ServerSocket的重要方法
Socket accept() //监听连接并创建一个Socket套接字
close() //关闭ServerSocket套接字
对于每一个客户端的请求,都会创建一个新的Socket对象,因此如果我们要实现多线程通信,那么我们可以循环执行ServerSocket.accept()方法来获取与不同客户端通信的Socket。
1.2 Socket方法
Socket构造方法(经常使用的)
Socket() //创建一个无连接的Socket
Socket(InnetAddress address,int port);//使用InnetAddress获取需要绑定远程服务器的地址,指明远程服务器的端口号
Socket(String host,in port)//使用字符串的方式指明需要绑定的远程服务器的地址和远程服务器的端口号
Socket的重要方法
void close() //关闭Socket
InputStream getInputStream() //从Socket中获取输入流(获取从发送方发送的数据)
OutputStream getOutputStream() //从Socket中获取输出流(将信息写入Socket中传给接收方)
void shutdownInput() //使输入流无效
void shutdownOutput() //使输出流无效
二、Socket编程流程
2.1、Server端需要做的事情
- 创建一个ServerSocket,绑定对象监听端口,因为0~1023之间的端口大部分分配给电脑设备了,因此我们随机分配一个1024~635535之间的端口。
- 通过ServerSocket.accept()监听Client端的请求,等待客户端与之通信
- 通过输入流读取客户端发送的信息请求,读取完成以后使用Socket.shutdownOutput()关闭输出流
- 通过输出流向客户端发送响应信息,输出流完成时需要执行flush方法和Socket.shutdownInput()关闭输入流
- 关闭InputStream、OutputStream、ServerSocket、Socket占用的资源。
2.2、Client端需要做的事情
- 创建Socket,指定我们要连接的远程Server的IP地址和端口号
- 通过输入流向Server端发送信息,并执行flush()方法,然后调用Socket.shutdownInput()
- 通过输出流读取Server端传输过来的信息,执行完以后调用Socket.shutdownOutput();
- 最后释放所有的资源,InputStream、OutputStream、Socket。
三、单线程通信
3.1、服务端代码
package NetworkProgramming;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args){
ServerSocket serverSocket = null;
Socket socket = null;
try {
//1、指定服务端需要监听的端口为8888,一般我们将端口号设置为1024-65535
serverSocket =