0
点赞
收藏
分享

微信扫一扫

TCP发送数据、接受数据及TCP通信程序练习


目录

​​一、TCP发送数据​​

​​二、TCP接收数据​​

​​三、TCP通信程序练习​​

一、TCP发送数据

Java中的TCP通信:

Java对于基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信

Java为客户端提供了Socket类,为服务端提供了ServerSocket类

构造方法:

方法名

说明

Socket(InetAddress address,int port)

创建流套接字并将其拼接到指定IP端口号

Socket(String host,int port)

创建流套接字并将其连接到指定主机上的指定端口号

相关方法:

方法名

说明

InputStream getInputStream()

返回此套接字的输入流

OutputStream getOutputStream()

返回此套接字的输出流

示例代码:

public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建客户端的Socket对象(Socket)
//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
Socket s = new Socket("192.168.1.66",10000);

//获取输出流,写数据
//OutputStream getOutputStream() 返回此套接字的输出流
OutputStream os = s.getOutputStream();
os.write("hello,tcp,我来了".getBytes());

//释放资源
s.close();
}
}

二、TCP接收数据

构造方法:

方法名

说明

ServletSocket(int port)

创建绑定到指定端口的服务器套接字

相关方法:

方法名

说明

Socket accept()

监听要连接到此的套接字并接收它

示例代码:

public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建服务器端的Socket对象(ServerSocket)
//ServerSocket(int port) 创建绑定到指定端口的服务器套接字
ServerSocket ss = new ServerSocket(10000);

//Socket accept() 侦听要连接到此套接字并接受它
Socket s = ss.accept();

//获取输入流,读数据,并把数据显示在控制台
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys,0,len);
System.out.println("数据是:" + data);

//释放资源
s.close();
ss.close();
}
}

三、TCP通信程序练习

需求:

● 客户端:数据来自于文本文件,接收服务器反馈

● 服务器:接收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程

案例分析:

● 创建客户端对象,创建输入流对象指向文件,没读入一行数据就给服务器输出一行数据,输出结束后使用shutdownOutput()方法告知服务器传输结束

● 创建多线程类,在run()方法中读取客户端发送的数据,为了防止文件重名,使用计数器给文件名编号,接受结束后使用输出流给客户端发送反馈信息

● 创建服务器对象,每监听到一个客户端则开启一个新的线程接受数据

● 客户端接受服务器回馈信息

代码实现:

public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建客户端Socket对象
Socket s = new Socket("192.168.1.66",10000);

//封装文本文件的数据
BufferedReader br = new BufferedReader(new FileReader("myNet\\InetAddressDemo.java"));
//封装输出流写数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

String line;
while ((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}

s.shutdownOutput();

//接收反馈
BufferedReader brClient = new BufferedReader(new
InputStreamReader(s.getInputStream()));
String data = brClient.readLine(); //等待读取数据
System.out.println("服务器的反馈:" + data);

//释放资源
br.close();
s.close();
}
}
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("myNet\\Copy["+count+"].java");
while (file.exists()) {
count++;
file = new File("myNet\\Copy["+count+"].java");
}
BufferedWriter bw = new BufferedWriter(new FileWriter(file));

String line;
while ((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}

//给出反馈
BufferedWriter bwServer = new BufferedWriter(new
OutputStreamWriter(s.getOutputStream()));
bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();

//释放资源
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建服务器Socket对象
ServerSocket ss = new ServerSocket(10000);

while (true) {
//监听客户端连接,返回一个对应的Socket对象
Socket s = ss.accept();
//为每一个客户端开启一个线程
new Thread(new ServerThread(s)).start();
}
}
}

举报

相关推荐

0 条评论