TCP通信协议
TCP是一种可靠的网络协议,它在通信的两端各建一个Socket对象,从而在通信的两端形成网络通信链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信 Java对基于TCP协议的网络提供了良好的封装,使用Socket对象代表两端的通信端口,并通过Socket产生的IO流进行网络通信 Java为客户端提供了Socket类,为服务端提供了SeveerSocket类
TCP发送数据
创建客户端的Socket对象 获取输出流写数据 释放资源
Socket socket = new Socket ( "10.5.219.110" , 42789 ) ;
OutputStream outputStream = socket. getOutputStream ( ) ;
outputStream. write ( "hello,tcp,俺老孙来也" . getBytes ( ) ) ;
socket. close ( ) ;
TCP接收数据
创建服务器端的Socket对象(SeverSocket) 获得输入流读数据,并把数据显示在控制台 释放资源
ServerSocket serverSocket = new ServerSocket ( 42789 ) ;
Socket accept = serverSocket. accept ( ) ;
InputStream inputStream = accept. getInputStream ( ) ;
byte [ ] bytes = new byte [ 1024 ] ;
int len= inputStream. read ( bytes) ;
System . out. println ( "接受的数据是 :" + new String ( bytes, 0 , len) ) ;
TCP通信程序练习
练习一
客户端:发送数据,接收服务器反馈 服务端:接收数据,给出反馈
客户端
Socket socket = new Socket ( "10.5.219.110" , 42789 ) ;
OutputStream outputStream = socket. getOutputStream ( ) ;
outputStream. write ( "hello啊,TCP,俺老孙现在来找你啦!" . getBytes ( ) ) ;
InputStream inputStream = socket. getInputStream ( ) ;
byte [ ] bytes = new byte [ 1024 ] ;
System . out. println ( "客户端 :" + new String ( bytes, 0 , inputStream. read ( bytes) ) ) ;
socket. close ( ) ;
服务器端
ServerSocket serverSocket = new ServerSocket ( 42789 ) ;
Socket accept = serverSocket. accept ( ) ;
InputStream inputStream = accept. getInputStream ( ) ;
byte [ ] bytes = new byte [ 1024 ] ;
int len= inputStream. read ( bytes) ;
System . out. println ( "服务器 :" + new String ( bytes, 0 , len) ) ;
OutputStream outputStream = accept. getOutputStream ( ) ;
outputStream. write ( "数据已收到" . getBytes ( ) ) ;
练习二
客户端
public class InetAddressDemo {
public static void main ( String [ ] args) throws IOException {
Socket socket = new Socket ( "10.5.219.110" , 42789 ) ;
BufferedReader bufferedReader = new BufferedReader ( new InputStreamReader ( System . in) ) ;
BufferedWriter bufferedWriter = new BufferedWriter ( new OutputStreamWriter ( socket. getOutputStream ( ) ) ) ;
String line;
while ( ( line= bufferedReader. readLine ( ) ) != null ) {
if ( "886" . equals ( line) ) {
break ;
}
bufferedWriter. write ( line) ;
bufferedWriter. newLine ( ) ;
bufferedWriter. flush ( ) ;
}
socket. close ( ) ;
}
}
接收端
public class ReceiveDemo {
public static void main ( String [ ] args) throws IOException {
ServerSocket serverSocket = new ServerSocket ( 42789 ) ;
Socket accept = serverSocket. accept ( ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( accept. getInputStream ( ) ) ) ;
String line;
while ( ( line= br. readLine ( ) ) != null ) {
System . out. println ( line) ;
}
serverSocket. close ( ) ;
}
}
练习三
客户端:数据来自于键盘录入,知道输入的数据是886,发送数据结束 服务器端:接收到的数据写入文本文件
客户端
接收端
public class ReceiveDemo {
public static void main ( String [ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 42789 ) ;
Socket s = ss. accept ( ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( s. getInputStream ( ) ) ) ;
BufferedWriter bw = new BufferedWriter ( new FileWriter ( "D:\\java.code\\File\\Cx_330.txt" ) ) ;
String line;
while ( ( line= br. readLine ( ) ) != null ) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
bw. close ( ) ;
ss. close ( ) ;
}
}
练习四
客户端:数据来自于文本文件 服务器端:接收到的数据写入文本文件
客户端
Socket ss = new Socket ( "10.5.219.110" , 42789 ) ;
BufferedReader br = new BufferedReader ( new FileReader ( "D:\\java.code\\File\\Cx_330.txt" ) ) ;
BufferedWriter bw = new BufferedWriter ( new OutputStreamWriter ( ss. getOutputStream ( ) ) ) ;
String line;
while ( ( line= br. readLine ( ) ) != null ) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
ss. close ( ) ;
br. close ( ) ;
服务器端
练习五
客户端:数据来自于文本文件,接收服务器反馈 服务器端:收到的数据写入文本文件,给出反馈
客户端
Socket ss = new Socket ( "10.5.219.110" , 42789 ) ;
BufferedReader br = new BufferedReader ( new FileReader ( "D:\\java.code\\File\\Cx_330.txt" ) ) ;
BufferedWriter bw = new BufferedWriter ( new OutputStreamWriter ( ss. getOutputStream ( ) ) ) ;
String line;
while ( ( line= br. readLine ( ) ) != null ) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
ss. shutdownOutput ( ) ;
BufferedReader bfr = new BufferedReader ( new InputStreamReader ( ss. getInputStream ( ) ) ) ;
System . out. println ( "客户端 :" + bfr. readLine ( ) ) ;
ss. close ( ) ;
br. close ( ) ;
服务器端
ServerSocket ss = new ServerSocket ( 42789 ) ;
Socket s = ss. accept ( ) ;
BufferedReader br = new BufferedReader ( new InputStreamReader ( s. getInputStream ( ) ) ) ;
BufferedWriter bw = new BufferedWriter ( new FileWriter ( "D:\\java.code\\File\\Cx.txt" ) ) ;
String line;
while ( ( line= br. readLine ( ) ) != null ) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
BufferedWriter bfw = new BufferedWriter ( new OutputStreamWriter ( s. getOutputStream ( ) ) ) ;
bfw. write ( "数据上传成功" ) ;
bfw. newLine ( ) ;
bfw. flush ( ) ;
bw. close ( ) ;
ss. close ( ) ;
练习六
客户端:数据来自文本文件,接收服务器反馈 服务器端:收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程
客户端
服务器端
public class ReceiveDemo {
public static void main ( String [ ] args) throws IOException {
ServerSocket ss = new ServerSocket ( 42789 ) ;
while ( true ) {
Socket s = ss. accept ( ) ;
new Thread ( new ServerThread ( s) ) . start ( ) ;
}
}
}
线程类
public class ServerThread implements Runnable {
private Socket s;
public ServerThread ( Socket s) {
this . s = s;
}
@Override
public void run ( ) {
try {
BufferedReader br = new BufferedReader ( new InputStreamReader ( s. getInputStream ( ) ) ) ;
int count= 0 ;
File file = new File ( "D:\\java.code\\File\\Cx[" + count + "].txt" ) ;
while ( file. exists ( ) ) {
count++ ;
file = new File ( "D:\\java.code\\File\\Cx[" + count + "].txt" ) ;
}
BufferedWriter bw = new BufferedWriter ( new FileWriter ( file) ) ;
String line;
while ( ( line = br. readLine ( ) ) != null ) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
BufferedWriter bfw= new BufferedWriter ( new OutputStreamWriter ( s. getOutputStream ( ) ) ) ;
bfw. write ( "数据上传成功" ) ;
bfw. newLine ( ) ;
bfw. flush ( ) ;
s. close ( ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}