目录
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();
- }
- }
构造方法:
| 方法名 | 说明 |
| 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();
- }
- }
需求:
● 客户端:数据来自于文本文件,接收服务器反馈
● 服务器:接收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程
案例分析:
● 创建客户端对象,创建输入流对象指向文件,没读入一行数据就给服务器输出一行数据,输出结束后使用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();
- }
- }
- }