java 中模拟TCP传输的客户端和服务端实例详解
一、创建TCP传输的客户端
1、建立TCP客户端的Socket服务,使用的是Socket对象,建议该对象一创建就明确目的地,即要连接的主机;
2、如果连接建立成功,说明数据传输通道已建立,该通道就是Socket流,是底层建立好的,既然是流,说着这里既有输入流,又有输出流,想要输入流或者输出流对象,可以通过Socket来获取,可以通过getOutputStream()和getInputStream()来获取;
3、使用输出流,将数据写出;
4、关闭Socket服务。
importjava.io.IOException;
importjava.io.OutputStream;
importjava.net.Socket;
publicclassClient{
publicstaticvoidmain(String[]args)throwsIOException{
//1、创建客户端的Socket服务
Socketsocket=newSocket("192.168.1.100",10002);
//2、获取Socket流中输入流
OutputStreamout=socket.getOutputStream();
//3、使用输出流将指定的数据写出去
out.write("TCPiscoming!".getBytes());
//4、关闭Socket服务
socket.close();
}
}
二、创建TCP传输的服务端
1、建立TCP服务端的的Socket服务,通过ServerSocket对象;
2、服务端必须对外提供一个端口,否则客户端无法连接;
3、获取连接过来的客户端对象;
4、通过客户端对象来获取Socket流,读取客户端发来的数据;
5、关闭资源,关客户端,关服务端。
importjava.io.IOException;
importjava.io.InputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassServer{
publicstaticvoidmain(String[]args)throwsIOException{
//1、创建客户端对象
ServerSocketss=newServerSocket(10002);
//2、获取连接过来的客户端对象
Sockets=ss.accept();
Stringip=s.getInetAddress().getHostAddress();
//3、通过Socket对象获取输入流,读取客户端发来的数据
InputStreamin=s.getInputStream();
byte[]buf=newbyte[1024];
intlen=in.read(buf);
Stringtext=newString(buf,0,len);
System.out.println(ip+":"+text);
//4、关闭资源
s.close();
ss.close();
}
}
三、优化TCP传输的客户端和服务端
在本部分,我们对前两部分的内容进行优化,实现TCP传输模式下的客户端和服务端的交互功能。
/**
*优化TCP传输的客户端
*/
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.Socket;
publicclassClientUpdate{
publicstaticvoidmain(String[]args)throwsIOException{
Socketsocket=newSocket("192.168.1.100",10002);
OutputStreamout=socket.getOutputStream();
out.write("tcp!".getBytes());
//读取服务端返回的数据,使用Socket读取流
InputStreamin=socket.getInputStream();
byte[]buf=newbyte[1024];
intlen=in.read(buf);
Stringtext=newString(buf,0,len);
System.out.println(text);
socket.close();
}
}
/**
*优化TCP传输的服务端
*/
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassServerUpdate{
publicstaticvoidmain(String[]args)throwsIOException{
//1、创建服务端对象
ServerSocketss=newServerSocket(10002);
//2、获取连接过来的客户端对象
Sockets=ss.accept();//accept方式为阻塞式方法
Stringip=s.getInetAddress().getHostAddress();
//3、通过Socket对象获取输入流,要读取客户端发来的数据
InputStreamin=s.getInputStream();
byte[]buf=newbyte[1024];
intlen=in.read(buf);
Stringtext=newString(buf,0,len);
System.out.println(ip+":"+text);
//使用客户端的Socket对象的输出流给客户端返回数据
OutputStreamout=s.getOutputStream();
out.write("收到".getBytes());
s.close();
ss.close();
}
}
四、创建英文大写转换服务器
应用TCP(TransmissionControlProtocol,传输控制协议)的相关性质,创建一个基于TCP传输下的英文大写转换服务器,要求:客户端输入字母数据,发送给服务端;服务端收到数据后显示在控制台,并将该数据转成大写字母返回给客户端;直到客户端输入“over”为止,转换结束。
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.Socket;
publicclassTransClient{
publicstaticvoidmain(String[]args)throwsIOException{
/**
*思路:创建客户端
*1、创建Socket客户端对象
*2、获取键盘录入的数据
*3、将录入的信息发送给Socket输出流
*4、读取服务端的数据并返回的大写数据
*/
//1、创建Socket客户端对象
Sockets=newSocket("192.168.1.100",10004);
//2、获取键盘录入
BufferedReaderbufr=newBufferedReader(newInputStreamReader(System.in));
//3、Socket输出流
PrintWriterout=newPrintWriter(s.getOutputStream(),true);
//4、Socket输入流,读取服务端的数据并返回的大写数据
BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
Stringline=null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
out.println(line);
//读取服务端返回的一行大写数据
StringupperStr=bufIn.readLine();
System.out.println(upperStr);
}
s.close();
}
}
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassTransServer{
publicstaticvoidmain(String[]args)throwsIOException{
/**
*思路:创建服务端
*1、创建SeverSocket客户端对象
*2、获取Socket流
*3、通过Socket,读取客户端发过来的需要转换的数据
*4、显示在控制台上
*5、将数据转换成大写返回给客户端
*/
//1、创建SeverSocket对象
ServerSocketss=newServerSocket(10004);
//2、获取Socket对象
Sockets=ss.accept();
//获取IP地址
Stringip=s.getInetAddress().getHostAddress();
System.out.println(ip+"......connected");
//3、获取Socket读取流,并装饰
BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
//4、获取Socket的输出流,并装饰
PrintWriterout=newPrintWriter(s.getOutputStream(),true);
Stringline=null;
while((line=bufIn.readLine())!=null){
System.out.println(line);
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!