TCP通信案例_Socket

客户端向服务器发送数据

注意事项:

  • 要先启动服务端 , 如果先启动客户端 , 找不到对应的服务端的话会马上报错.
  • 如果服务端是启动状态 , 不能再次启动 , 否则会发生端口号冲突
  • 接收数据不能用while循环 , 第一个在会话过程中没必要,第二个会发生数据错误的问题,导致程序异常

客户端:

package com.liqiliang.demo04_TCP循环聊天;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/*
TCP客户端的实现
 */
public class Client {
    public static void main(String[] args) throws IOException, InterruptedException {
        //1.创建客户端Socket对象,指定服务器端的IP和端口
        Socket socket = new Socket("127.0.0.1", 9999);

        //2.获取网络输出流,进行发送数据
        OutputStream netOut = socket.getOutputStream();
        //3.获取网络的输入流,进行接收数据
        InputStream netIn = socket.getInputStream();


        Scanner sc = new Scanner(System.in);
        while (true){
            System.out.println("To Server:");
            String msg = sc.next();

            if("exit".equals(msg)){
                socket.shutdownOutput();//通知服务端,客户端的消息已经发送结束,没有必要再等待数据的发送
                System.exit(0);
            }
            //发送数据
        netOut.write(msg.getBytes());
        byte[] bytes = new byte[1024]; //一次接收1024个字节
        int len = netIn.read(bytes);//读取了多少个有效的字节个数
        System.out.println("Server:"+new String(bytes, 0, len));//将有效的字节信息转换为字符串

        Thread.sleep(1000);

        }
        //4.结束关闭释放资源
//        socket.close();
    }

}

服务端:

package com.liqiliang.demo04_TCP循环聊天;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
 //服务器代码实现
public class Server {
    public static void main(String[] args) throws IOException, InterruptedException {
        //1.创建服务端ServerSocket对象,绑定端口
        ServerSocket serverSocket = new ServerSocket(9999);

        //2.服务端对象调用accept方法,返回一个新的Socket对象(服务),
        System.out.println("服务端开启,等待客户端连接...");
        Socket socket = serverSocket.accept();//也会发生阻塞,等待客户端的连接
        System.out.println("有客户端进来...IP:" + socket.getInetAddress());

        //3.获取Socket的输入流,读取客户端发送的数据 getInputStream()
        InputStream netIn = socket.getInputStream();

        //4.获取Socket的输出流,写出数据给客户端 getOutputStream
        OutputStream netOut = socket.getOutputStream();

        Scanner sc = new Scanner(System.in);
        while (true) {


            byte[] bytes = new byte[1024];
            int len = netIn.read(bytes);
            System.out.println("Client:"+new String(bytes, 0, len));

            System.out.println("To Client:");
            String str = sc.next();
            netOut.write(str.getBytes());

            Thread.sleep(1000);
        }

        //5.关闭释放资源
//        socket.close();
//        serverSocket.close();//理论上服务端是不能关闭的
    }
}

posted @ 2020-06-15 14:33  阿亮在努力  阅读(209)  评论(0)    收藏  举报