java网络编程实现两端聊天

网络编程的三要素:

  1. ip地址:唯一标识网络上的每一台计算机
  2. 端口号:计算机中应用的标号(代表一个应用程序),0-1024系统使用或者保留端口,有效端口0-65535(short)
  3. 通信协议:通信的规则 TCP UDP

UDP:相当于发短信,不需要建立连接,数据包的大小限制在64k内,效率高,不安全,容易丢包

TCP:相当于打电话,需要建立连接,效率相对较低,数据传输安全,三次握手完成。


下面使用TCP进行网络通信:
服务端:

public static void main(String[] args) throws Exception {
        //创建服务端的对象
        ServerSocket ss = new ServerSocket(8000);
        //等待客户端的接入
        Socket client = ss.accept();
        //从输入流中得到数据
        InputStream is = client.getInputStream();
        byte[] by = new byte[1024];
        int len = is.read(by);
        String str = new String(by,0,len);
        System.out.println(str);
        //关闭
        client.shutdownInput();
        is.close();
        client.close();

    }

客户端:

public static void main(String[] args) throws Exception {
        //创建客户端套接字对象,给定ip地址
        Socket client = new Socket("192.168.6.166",8000);
        //获取客户端的输出流
        OutputStream os = client.getOutputStream();
        //向输出流中写入数据
        os.write("在?".getBytes());
        os.flush();
        //切断输出流
        client.shutdownOutput();
        //关闭流对象,关闭套接字
        is.close();
        os.close();
        client.close();

    }

通过上面的代码能够实现基本的发送信息,和接收信息。不过只能客户端发送信息,服务器被动接收信息,下面来实现客户端和服务器互相发送信息:

服务器端:

public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8000);
        Scanner sc = new Scanner(System.in);
        System.out.println("服务器启动!");
        Socket s = ss.accept();
        OutputStream os = s.getOutputStream();
        InputStream is = s.getInputStream();
        boolean bool = true;
        while(bool){
            //服务器接收信息
            byte[] bt = new byte[1024];
            int length = is.read(bt);
            System.out.println("\t\t\t"+new String(bt,0,length)+":客户端");
            //服务器发送信息
            System.out.println("服务器:");
            os.write(sc.next().getBytes());
            os.flush();
        }
        s.shutdownInput();
        is.close();
        os.close();
        s.close();
        ss.close();

    }

客户端:

public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("客户端启动");
        Socket client = new Socket("127.0.0.1",8000);
        Scanner sc = new Scanner(System.in);
        boolean bool = true;
        OutputStream os = client.getOutputStream();
        InputStream is = client.getInputStream();
        while(bool){
            //客户端发送信息
            System.out.println("客户端:");
            String str = sc.next();
            os.write(str.getBytes());
            os.flush();
            //客户端接收信息
            byte[] by = new byte[1024];
            int index = is.read(by);
            System.out.println("\t\t\t"+new String(by,0,index)+":服务器");
        }
        client.shutdownOutput();
        os.close();
        is.close();
        sc.close();
        client.close();
    }

使用上面的方式进行通信,实现结果:
客户端:
java网络编程实现两端聊天_第1张图片

服务器:
java网络编程实现两端聊天_第2张图片


这样实现了两端相互通信的要求,如果一方连续发送两条信息的时候,这个程序就会开始出现问题。于是使用线程解决这个问题,具体如下:

客户端:

public class servletSockettest {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8888);
        System.out.println("服务器启动!");
        final Socket s = ss.accept();
        boolean b = true;
        InputStream is = s.getInputStream();
        //服务器把输入放入线程里面执行,不会影响主线程的接收信息功能
        Thread t = new Thread(){
            OutputStream os = s.getOutputStream();
            Scanner sc  = new Scanner(System.in);
            @Override
            public void run() {
                // TODO Auto-generated method stub
                boolean b = true;
                while(b){
                    try {
                        System.out.print("服务器输入:");
                        os.write(sc.next().getBytes());
                        os.flush();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };
        t.start();
        while(b){
            byte[] bt = new byte[1024];
            int length = is.read(bt);
            String str = new String(bt,0,length);
            System.out.println("\t\t\t"+str+":客户端");
        }


        is.close();
        s.shutdownInput();
        s.close();
        ss.close();

    }
}

客户端:

public class Sockettest {
    public static void main(String[] args) throws UnknownHostException, IOException {
        final Socket client = new Socket("192.168.6.166",8888);
        Scanner sc = new Scanner(System.in);
        System.out.println("客户端启动");
        OutputStream os = client.getOutputStream();
        //新建一个线程用来接收信息,不影响主线程的输入发送信息。
        Thread t = new Thread(){
            InputStream is = client.getInputStream();
            @Override
            public void run() {
                // TODO Auto-generated method stub
                boolean b = true;
                while(b){
                    try {
                        byte[] bt = new byte[1024];
                        int length = is.read(bt);
                        String str = new String(bt,0,length);
                        System.out.println("\t\t\t"+str+":服务器");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };
        t.start();
        boolean b = true;
        while(b){
            System.out.print("客户端输入:");
            os.write(sc.next().getBytes());
            os.flush();
        }
        os.close();
        client.shutdownOutput();
        client.close();
    }
}

运行结果:
客户端
java网络编程实现两端聊天_第3张图片
服务器:
java网络编程实现两端聊天_第4张图片

这样就可以实现基本上的通信了。如果有兴趣,可以结合JFrame窗体,实现多个窗口相互聊天,不再使界面这么难看。

你可能感兴趣的:(javaSE)