Java 网络编程之TCP通信和简单的文件上传功能

TCP通信需要明确的几点:

tcp通信是面向连接的,需要先启动服务端,再启动客户端。

客户端和服务端都要创建套接字对象,客户端需要指定服务端套接字(ip+port),而服务端必须指定服务端口。 Socket client_socket = new Socket("192.168.100.17",8888); //客户端套接字(Socket类的套接字为已连接套接字) ServerSocket listen_socket = new ServerSocket(8888); //服务端套接字,此时为监听套接字(已经bind()地址和端口了)

服务端需要使用accept()方法将监听套接字转变为已连接套接字。这个监听套接字可以生成多个已连接套接字,这样连接后还能监听其他客户端的请求。因此,这里应该使用多线程实现并发访问。获得了已连接套接字,就可以获取很多客户端的信息,例如客户端的ip地址,发送请求的端口等。

Socket server_scoket = socket.accept(); Socket server_scoket2 = socket.accept(); Socket server_scoket3 = socket.accept();

服务端要实现并发连接,大致使用如下代码:其中ThreadTask是线程任务对象。

public static void main(String[] args) throws IOException { ServerSocket listen_sock = new ServerSocket(8888); //监听套接字只需创建一个,因此在任务之外 while (true) { //每建立一个连接,就开启一个线程 Socket conn_sock = listen_sock.accept(); //没有新连接进来时,main主线程阻塞在此 new Thread(new ThreadTask(conn_sock)).start(); } }

客户端需要根据已连接套接字获取输出流,服务端需要根据套接字获取输入流。当然,既然有了已连接套接字,那么获取无论哪一端都可以获取到输入流、输出流。 OutputStream send_stream = client_socket.getOutputStream(); //客户端获取输出流 InputStream recv_stream = server_socket.getInputStream();

服务端应主动关闭已连接套接字,至于监听套接字则在合适的地方关闭。

服务端应该循环不断地负责接收。

简单的Client端:

import Java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class TCPClient { public static void main(String[] args) { // 1.创建客户端套接字 Socket c_sock = null; OutputStream client_outstream = null; try { c_sock = new Socket("192.168.0.124",8888); // 2.获取输出流 client_outstream = c_sock.getOutputStream(); // 3.输出数据 client_outstream.write("Hello,i'm coming".getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { if(c_sock != null){ try{ c_sock.close(); } catch(IOException e) { e.printStackTrace(); } } } } }

简单的Server端:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) { // 1.创建监听套接字 ServerSocket listen_sock = null; try { listen_sock = new ServerSocket(8888); } catch(IOException i) { i.printStackTrace(); } Socket server_sock = null; InputStream in_sock = null; while (true) { try { // 2.和客户端建立连接,生成已连接套接字,并获取客户端ip地址 server_sock = listen_sock.accept(); String client_ip = server_sock.getInetAddress().getHostAddress(); System.out.println("Client: " + client_ip + " connected"); // 3.根据已连接套接字,获取输入流,读取客户端发送的数据 in_sock = server_sock.getInputStream(); BufferedReader bufr = new BufferedReader(new InputStreamReader(in_sock)); String line = null; while ((line = bufr.readLine()) != null) { System.out.println(line); } // 4.关闭已连接套接字 server_sock.close(); } catch (IOException e) { e.printStackTrace(); } } } }

以下是tcp实现文件上传功能:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f3f060bbf233ac79f4a083f4a534ae96.html