Java通过ServerSocket与Socket实现TCP通信,各种例子

字符流输出时如果用os.wirte输出,接受端要只能用字节流接受
字符流输出时如果用os.println输出,接受端可用字节流接受,也可用字符流接受
os.println()只能输出字符或者字符串,如果是字节,接受端解析不出来
is.readLine(),是字符输出流独有的,直接输出内容,直接输出流没有此方法
new String(Byte[]),接受字节流的数据读取,与byte[] byteData = new byte[1024 * 1024]一起使用;
接受流都用缓存流来接受:
输入字符缓存流:BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
输入字节缓存流:BufferedInputStream reader = new BufferedInputStream(socket.getInputStream());
输出字符流:PrintWriter pw = new PrintWriter(socket.getOutputStream());
输出字节流:PrintStream pw = new PrintStream(socket.getOutputStream());
accept()方法会阻塞一直等待客户端链接才可往下执行
read(),readLine()也会阻塞,等待数据传输和链接,如果忽然断电或者断网,或一直卡住在等待,可以设置一直链接超时时间,例如设置超时5秒抛出异常,socket.setSoTimeout(5000);

1:简单的一次(字符) 通讯ServerSocket

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

public class TcpServer{
    public static void main(String[] args) {
        try {
            //创建一个serverSocket监听一个8080端口
            ServerSocket server = new ServerSocket(8089);
            //等待请求
            Socket socket = server.accept();
            //接收到请求后使用socket通信
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = reader.readLine();
            System.out.println("收到客户端信息:" + line);
            //向客户端发送信息
            PrintWriter pw = new PrintWriter(socket.getOutputStream());
            pw.println("我收到了信息:" + line);
            pw.flush();
            pw.close();
            reader.close();
            socket.close();
            server.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

2:简单的一次(字符) 通讯Socket

import java.io.*;
import java.net.Socket;

public class TcpClient {


    public static void main(String[] args) {
        String msg = "我是客户端";
        try {
            Socket cli = new Socket("127.0.0.1", 8089);
            PrintWriter pw = new PrintWriter(cli.getOutputStream());
            BufferedReader br = new BufferedReader(new InputStreamReader(cli.getInputStream()));
            pw.println(msg);
            pw.flush();
            String line = br.readLine();
            System.out.println("收到服务端信息:" + line);
            pw.close();
            br.close();
            cli.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3:简单的一次(字节) 通讯ServerSocket


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class MyClass {
    public static void main(String[] args) {
        try {
            //创建一个serverSocket监听一个8080端口
            ServerSocket server = new ServerSocket(8089);
            //等待请求
            Socket socket = server.accept();
            byte[] byteData = new byte[1024 * 1024];
            //接收到请求后使用socket通信
            BufferedInputStream reader = new BufferedInputStream(socket.getInputStream());
            int line = reader.read(byteData);
            System.out.println("收到客户端信息:" + new String(byteData));
            //向客户端发送信息
            PrintStream pw = new PrintStream(socket.getOutputStream());
            String out="我收到了信息:";
            pw.write(out.getBytes());
            pw.flush();
            pw.close();
            reader.close();
            socket.close();
            server.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

4:简单的一次(字节) 通讯Socket

import java.io.*;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) {
        String msg = "我是客户端";
        try {
            Socket cli = new Socket("127.0.0.1", 8089);
            byte[] byteData = new byte[1024 * 1024];
            PrintStream pw = new PrintStream(cli.getOutputStream());
            BufferedInputStream br = new BufferedInputStream(cli.getInputStream());
            pw.write(msg.getBytes());
            pw.flush();
            int line = br.read(byteData);
            System.out.println("收到服务端信息:" + new String(byteData));
            pw.close();
            br.close();
            cli.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5:支持多设备(字节) 通讯ServerSocket


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class MyClass {
    public static void main(String[] args) {
        try {
            //创建一个serverSocket监听一个8080端口
            final ServerSocket server = new ServerSocket(8089);
            //等待请求
            while (true) {
                final Socket socket = server.accept();
                //设置read读取超时时间
                socket.setSoTimeout(5000);
                final byte[] byteData = new byte[1024 * 1024];
                //接收到请求后使用socket通信
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            BufferedInputStream reader = new BufferedInputStream(socket.getInputStream());
                            int line = reader.read(byteData);
                            System.out.println("收到客户端信息:" + new String(byteData).trim());
                            //向客户端发送信息
                            PrintStream pw = new PrintStream(socket.getOutputStream());
                            String out = "我收到了信息:";
                            pw.write(out.getBytes());
                            pw.flush();
                            pw.close();
                            reader.close();
                            socket.close();
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                }).start();
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

6:TCP客户端,推荐这种做法

public static void main(String[] args) throws Exception {
    String serverHostname = "127.0.0.1"; // 服务器IP地址
    int serverPort = 6789; // 服务器端口号
    // 建立TCP连接
    Socket clientSocket = new Socket(serverHostname, serverPort);
    // 发送数据
    OutputStream outToServer = clientSocket.getOutputStream();
    DataOutputStream out = new DataOutputStream(outToServer);
    String message = "Hello, server!";
    out.writeUTF(message);
    // 接收响应
    InputStream inFromServer = clientSocket.getInputStream();
    DataInputStream in = new DataInputStream(inFromServer);
    String responseMessage = in.readUTF();
    System.out.println("Response message from server: " + responseMessage);
    // 关闭连接
    clientSocket.close();
}

7:TCP服务端,推荐这种做法

public static void main(String[] args) throws Exception {
    int serverPort = 6789;
    // 建立TCP连接
    ServerSocket serverSocket = new ServerSocket(serverPort);
    System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
    // 等待客户端连接
    Socket server = serverSocket.accept();
    System.out.println("Just connected to " + server.getRemoteSocketAddress());
    // 接收数据
    DataInputStream in = new DataInputStream(server.getInputStream());
    //如果发送的不是字符串,需要用注释的方法接收数据,不然接收不到数据
    //byte[] buffer = new byte[1024];
    //int bytesRead = in.read(buffer);
    //System.out.println("Bytes received: " + bytesRead);
    //String message = new String(buffer, 0, bytesRead, "UTF-8");
    //System.out.println("Message received: " + message);
    
    //只能接收字符串数据
    String message = in.readUTF();
    System.out.println("Message received from client: " + message);
    // 发送响应
    OutputStream outToClient = server.getOutputStream();
    DataOutputStream out = new DataOutputStream(outToClient);
    String responseMessage = "Hello, client!";
    out.writeUTF(responseMessage);
    // 关闭连接
    server.close();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你提供一份基于 Java 实现 TCP 网络通信的教程。以下是实现 TCP 通信的基本步骤: 1. 创建服务端套接字并监听端口: ```java ServerSocket serverSocket = new ServerSocket(portNumber); Socket clientSocket = serverSocket.accept(); ``` 2. 创建客户端套接字并连接到服务器: ```java Socket socket = new Socket(serverName, portNumber); ``` 3. 使用输入输出流进行数据传输: ```java // 从输入流中读取数据 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String inputLine = in.readLine(); // 向输出流中写入数据 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println(outputLine); ``` 4. 关闭套接字和流: ```java in.close(); out.close(); socket.close(); ``` 下面是一个简单的示例,演示如何使用 Java 实现 TCP 通信: 服务端代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { int portNumber = 1234; ServerSocket serverSocket = new ServerSocket(portNumber); Socket clientSocket = serverSocket.accept(); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); String inputLine, outputLine; outputLine = "Hello, client!"; out.println(outputLine); while ((inputLine = in.readLine()) != null) { out.println(inputLine); if (inputLine.equals("Bye.")) break; } in.close(); out.close(); clientSocket.close(); serverSocket.close(); } } ``` 客户端代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class TCPClient { public static void main(String[] args) throws IOException { String serverName = "localhost"; int portNumber = 1234; Socket socket = new Socket(serverName, portNumber); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); String inputLine, outputLine; while ((inputLine = in.readLine()) != null) { System.out.println("Server: " + inputLine); outputLine = "Hello, server!"; out.println(outputLine); if (inputLine.equals("Bye.")) break; } out.close(); in.close(); socket.close(); } } ``` 这个例子中,服务端向客户端发送字符串“Hello, client!”,接着客户端会向服务端发送字符串“Hello, server!”,并不断地将服务端返回的字符串输出到控制台上。当客户端发送“Bye.”字符串时,程序结束。 希望这个简单的教程能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值