Socket通信的一般步骤如下:
1、创建Socket和ServerSocket
2、打开连接到Socket的输入/输出流
3、按照相应的协议对Socket进行读/写操作
4、关闭输入/输出流,关闭Socket
基于TCP协议的Socket通信的步骤(分为服务器和客户端):
服务器:
1、创建ServerSocket,绑定一个监听端口
2、通过accept()方法监听客户端请求
3、建立连接后,通过输入流读取客户端数据,通过输出流向客户端发送数据
4、关闭输入/输出流,关闭Socket
客户端:
1、创建Socket,需要指明服务器的IP地址和端口号
2、建立连接后,通过输出流向服务器发送数据,通过输入流读取服务器的响应信息
3、关闭输入输出流,关闭Socket
基于TCP协议的Socket通信示例:
服务器(ServerSocket):
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//监听端口号30001的客户端请求,
ServerSocket ss=new ServerSocket(30001);
int count=0;
while(true){
Socket s=ss.accept();
//读取客户端数据
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream(), "utf-8"));
String cs=br.readLine();
s.shutdownInput();
//向客户端写入数据(文件)
File file=null;
if(cs.equals("a") || cs.equals("b")){
file=new File("./src/sources/"+cs+".txt");
}
else{
if(cs.equals("a.txt") || cs.equals("b.txt")){
file=new File("./src/sources/"+cs);
}
else{
continue;//请求的资源不存在
}
}
char[] b=new char[1024];
int len=-1;
Reader reader=new FileReader(file);
PrintWriter pw=new PrintWriter(s.getOutputStream());
while((len=reader.read(b))!=-1){
pw.write(b, 0, len);
}
pw.flush();//一定要刷新缓冲区将数据输出
s.shutdownOutput();
System.out.println("服务器执行完毕");
br.close();
reader.close();
pw.close();
s.close();
count++;
//服务器处理100000次请求之后关闭ServerSocket
if(count>100000) break;
}
ss.close();
}
}
客户端(Socket):
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//与服务器建立socket通信,"192.168.31.78"表示服务器IP地址,30001是端口号
Socket socket=new Socket("192.168.31.78", 30001);
PrintWriter pw=new PrintWriter(socket.getOutputStream());
pw.write("b.txt");//请求b.txt文件
pw.flush();//刷新缓冲区,将数据输出
socket.shutdownOutput();//客户端数据传输完毕后必须关闭输出流
//读取服务器数据,将数据写入到本地文件
int len=-1;
char[] chs=new char[1024];
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
File file=new File("./src/sources/b.txt");
Writer wr=new FileWriter(file);
while((len=br.read(chs))!=-1){
wr.write(chs, 0, len);
}
socket.shutdownInput();
pw.close();
br.close();
wr.close();
socket.close();
}
}