zoukankan      html  css  js  c++  java
  • 网络编程系列教材 (三)- 使用 Java Socket 开发多线程聊天程序

     

    如果使用单线程开发Socket应用,那么同一时间,要么收消息,要么发消息,不能同时进行。 

    为了实现同时收发消息,就需要用到多线程

    步骤1:同时收发消息
    步骤2:练习-有图形界面的聊天程序
    步骤3:答案-有图形界面的聊天程序

    步骤 1 : 同时收发消息

    练习-服务端和客户端互聊 中,只能一人说一句,说了之后,必须等待另一个人的回复,才能说下一句。

    这是因为接受和发送都在主线程中,不能同时进行。 为了实现同时收发消息,基本设计思路是把收发分别放在不同的线程中进行

    1. SendThread 发送消息线程
    2. RecieveThread 接受消息线程
    3. Server一旦接受到连接,就启动收发两个线程
    4. Client 一旦建立了连接,就启动收发两个线程

    package socket;

    import java.io.DataOutputStream;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.net.Socket;

    import java.util.Scanner;

    public class SendThread extends Thread{

        private Socket s;

        public SendThread(Socket s){

            this.s = s;

        }

        public void run(){

            try {

                OutputStream os = s.getOutputStream();

                DataOutputStream dos = new DataOutputStream(os);

                while(true){

                    Scanner sc = new Scanner(System.in);

                    String str = sc.next();

                    dos.writeUTF(str);

                }

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

             

        }

         

    }

    package socket;

    import java.io.DataInputStream;

    import java.io.DataOutputStream;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.OutputStream;

    import java.net.Socket;

    import java.util.Scanner;

    public class RecieveThread extends Thread {

        private Socket s;

        public RecieveThread(Socket s) {

            this.s = s;

        }

        public void run() {

            try {

                InputStream is = s.getInputStream();

                DataInputStream dis = new DataInputStream(is);

                while (true) {

                    String msg = dis.readUTF();

                    System.out.println(msg);

                }

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    package socket;

    import java.io.IOException;

    import java.net.ServerSocket;

    import java.net.Socket;

    public class Server {

        public static void main(String[] args) {

            try {

                ServerSocket ss = new ServerSocket(8888);

                System.out.println("监听在端口号:8888");

                Socket s = ss.accept();

                //启动发送消息线程

                new SendThread(s).start();

                //启动接受消息线程

                new RecieveThread(s).start();

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    package socket;

    import java.io.IOException;

    import java.net.Socket;

    import java.net.UnknownHostException;

    public class Client {

        public static void main(String[] args) {

            try {

                Socket s = new Socket("127.0.0.1"8888);

                // 启动发送消息线程

                new SendThread(s).start();

                // 启动接受消息线程

                new RecieveThread(s).start();

            catch (UnknownHostException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }


    更多内容,点击了解: https://how2j.cn/k/socket/socket-talk/401.html

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/Lanht/p/12615440.html
Copyright © 2011-2022 走看看