java 网络编程之TCP

时间:2022-12-18 00:28:31

java 网络编程之TCP,我们都知道网络编程有三要素:IP地址 协议 和端口号。其中java网络编程有2种,一种是TCP协议,是面向连接的。另一种是UDP协议,是面向无连接的。具体的可以百度。下面是一个TCP网络编程的例子:

服务器端:TCP协议中必须先启动服务器端,服务器端应该能并发处理多个客户端的请求,所以用到多线程。

服务器端可以分为5个步骤:
 1.创建socket对象
 2.监听客户端,获取客户端socket对象
 3.获得输出流 ,输出数据
 4.给客户端反馈
 5.关闭资源

Server类:

package TCPDemo;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 多线程
* tcp
* 服务器
* @author feige
*/
public class Server {
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(55328);
while (true) {
//监听客户端
Socket s = ss.accept();
new Thread(new ServerThread(s)).start();
}
}
}
多线程处理的ServerThread类

package TCPDemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
/**
* 服务器端多线程实现
* @author feige
*/
public class ServerThread implements Runnable {
private Socket s=null;//服务器端socket对象
private BufferedWriter bw=null;
private BufferedReader bi=null;
public ServerThread(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
try{
//包装管道的输入流为高效的字符流
bi=new BufferedReader(new InputStreamReader(s.getInputStream()));
//写数据
String newFileName=System.currentTimeMillis()+".txt";
bw=new BufferedWriter(new FileWriter(newFileName));
String line=null;
while((line=bi.readLine())!=null){//阻塞式
bw.write(line);
bw.newLine();
bw.flush();
}
//给反馈,包装管道的输出流为高效的字符流
BufferedWriter bwClient=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bwClient.write("文件已成功上传");
bwClient.newLine();
bwClient.flush();
}catch(IOException e){
e.printStackTrace();
}finally{
try {
//关闭资源
bw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端处理也分5个步骤:
  1.创建socket对象 
  2.获取输出流,写数据
  3.终止信息传递
  4.接收反馈
  5.关闭资源

Client 类:

package TCPDemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**多线程
* tcp
* 客户端:
* @author feige
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket client=new Socket("127.0.0.1",55328);//创建客户端socket对象
//包装文本文件
BufferedReader bi=new BufferedReader(new FileReader("a.txt"));
//包装管道的输出流为高效的字符流
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
String line=null;
while((line=bi.readLine())!=null){//阻塞试
bw.write(line);//写数据
bw.newLine();
bw.flush();
}
/**通道内不会读出该null值,即不能这样结束信息,所以服务器不知道是否结束了,
socket提供了一个终止是shutdownOutput()来告诉服务器终止信息传递了。**/
client.shutdownOutput();//终止信息传递
//接收反馈,包装管道的输入流为高效的字符流
BufferedReader biServer=new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.println(biServer.readLine());//阻塞试
//关闭资源
bi.close();
client.close();
}
}