首页 > 编程语言 >TCP发送数据、接受数据及TCP通信程序练习

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

时间:2022-10-08 20:04:35浏览次数:44  
标签:Socket 练习 TCP String 发送数据 new public 客户端


目录

​一、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();
}
}
}

标签:Socket,练习,TCP,String,发送数据,new,public,客户端
From: https://blog.51cto.com/u_15815415/5738618

相关文章

  • Spring面试(附练习代码)
    Spring01.@Value注解的作用是什么?基于@Value的注解可以读取properties或者是yml配置文件,使用如下:02.SpringAOP通知类型有哪些?Spring通知总共有五种:......
  • 练习题:简单薪水计算器
    练习题:简单薪水计算器题目:薪水计算器:(1)通过键盘输入用户的月薪,每年是几个月薪水(2)输出用户的年薪(3)输出一行字“如果年薪超过10万,恭喜你超过90%的国人”,“如果年......
  • TCP与UDP的联系和区别
    TCP与UDP的区别TCP是面向连接的,UDP是面向无连接的UDP程序结构较简单TCP是面向字节流的,UDP是基于数据报的TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不......
  • c语言练习
    //计算n的阶乘#include<stdio.h>intmain(){ inti=0; intn=0; intret=1; scanf("%d",&n); for(i=1;i<=n;i++) { ret=ret*i; } printf("ret=%d\n",ret); return0;}//......
  • TCP和UDP的联系和区别
    一、联系   TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。二、区别   1、TCP面向连接,UDP是无连接的,即......
  • 1: TCP与UDP的联系与区别 2:网络字节序与主机字节序的转换函数实践。
    第一问:TCP/IP协议是一个协议簇,里面包括很多协议的,UDP只是其中的一个,之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。TCP/IP协议集包括应用层,......
  • TCP和UDP的区别和联系
    UDP与TCP的联系与区别:1、联系首先,这两个都是运输层协议;都是建立在ip之上的TCP叫做流式套接字,UDP是报文套接字为什么要在IP之上?  2、区别tcp基于连接、UDP......
  • 【数据结构】时间复杂度和空间复杂度的练习题(仅供学习交流使用)
    习题:解:异或:相同为0相异为1     0和任何数异或都是那个数本身因为这个原理所以两个数交换可以考虑使用异或,不需要考虑顺序代码实现:(++i和i++结果是一样得,如果取返回......
  • TCP与UDP的联系与区别
    TCP(TransmissionControlProtocol,传输控制协议)他是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。这说明TCP连接是一个非常复杂的过程,需要进行“三......
  • 基于Netty的TCP服务框架
    19年写的一个基础的TCP服务框架,内置了一个简单IOC容器,当时的目标是一方面能作为组件供第三方集成实现TCP通讯相关功能,另一方面作为提供一种服务框架范式。所以框架核心点......