zoukankan      html  css  js  c++  java
  • 网络编程系列教材 (二)- Java Socket 收发消息入门例子

    使用 Socket(套接字)进行不同的程序之间的通信

    步骤1:建立连接 
    步骤2:收发数字
    步骤3:收发字符串
    步骤4:使用Scanner
    步骤5:练习-服务端和客户端互聊
    步骤6:答案-服务端和客户端互聊
    步骤7:练习-聊天机器人数据库
    步骤8:答案-聊天机器人数据库

    步骤 1 : 建立连接 

    1. 服务端开启8888端口,并监听着,时刻等待着客户端的连接请求 
    2. 客户端知道服务端的ip地址和监听端口号,发出请求到服务端 
    客户端的端口地址是系统分配的,通常都会大于1024 
    一旦建立了连接,服务端会得到一个新的Socket对象,该对象负责与客户端进行通信。 
    注意: 在开发调试的过程中,如果修改过了服务器Server代码,要关闭启动的Server,否则新的Server不能启动,因为8888端口被占用了

    建立连接

    package socket;

      

    import java.io.IOException;

    import java.net.ServerSocket;

    import java.net.Socket;

       

    public class Server {

       

        public static void main(String[] args)  {

            try {

                //服务端打开端口8888

                ServerSocket ss = new ServerSocket(8888);

                   

                //在8888端口上监听,看是否有连接请求过来

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

                Socket s =  ss.accept();

                   

                System.out.println("有连接过来" + s);

                 

                s.close();

                ss.close();

            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 {

                //连接到本机的8888端口

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

                System.out.println(s);

                s.close();

            catch (UnknownHostException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    步骤 2 : 收发数字

    一旦建立了连接,服务端和客户端就可以通过Socket进行通信了 
    1. 客户端打开输出流,并发送数字 110 
    2. 服务端打开输入流,接受数字 110,并打印

    package socket;

    import java.io.IOException;

    import java.io.InputStream;

    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();

                //打开输入流

                InputStream is = s.getInputStream();

                //读取客户端发送的数据

                int msg = is.read();

                //打印出来

                System.out.println(msg);

                is.close();

                s.close();

                ss.close();

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    package socket;

    import java.io.IOException;

    import java.io.OutputStream;

    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);

                // 打开输出流

                OutputStream os = s.getOutputStream();

                // 发送数字110到服务端

                os.write(110);

                os.close();

                s.close();

            catch (UnknownHostException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    步骤 3 : 收发字符串

    直接使用字节流收发字符串比较麻烦,使用数据流对字节流进行封装,这样收发字符串就容易了 
    1. 把输出流封装在DataOutputStream中 
    使用writeUTF发送字符串 "Legendary!" 
    2. 把输入流封装在DataInputStream 
    使用readUTF读取字符串,并打印

    package socket;

    import java.io.DataInputStream;

    import java.io.IOException;

    import java.io.InputStream;

    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();

                InputStream is = s.getInputStream();

                //把输入流封装在DataInputStream

                DataInputStream dis = new DataInputStream(is);

                //使用readUTF读取字符串

                String msg = dis.readUTF();

                System.out.println(msg);

                dis.close();

                s.close();

                ss.close();

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    package socket;

    import java.io.DataOutputStream;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.net.Socket;

    import java.net.UnknownHostException;

    import java.util.Scanner;

    public class Client {

        public static void main(String[] args) {

            try {

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

                OutputStream os = s.getOutputStream();

                //把输出流封装在DataOutputStream中

                DataOutputStream dos = new DataOutputStream(os);

                //使用writeUTF发送字符串

                dos.writeUTF("Legendary!");

                dos.close();

                s.close();

            catch (UnknownHostException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    步骤 4 : 使用Scanner

    在上个步骤中,每次要发不同的数据都需要修改代码 
    可以使用Scanner读取控制台的输入,并发送到服务端,这样每次都可以发送不同的数据了。

    package socket;

    import java.io.DataOutputStream;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.net.Socket;

    import java.net.UnknownHostException;

    import java.util.Scanner;

    public class Client {

        public static void main(String[] args) {

            try {

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

                OutputStream os = s.getOutputStream();

                DataOutputStream dos = new DataOutputStream(os);

                 

                //使用Scanner读取控制台的输入,并发送到服务端

                Scanner sc = new Scanner(System.in);

                 

                String str = sc.next();

                dos.writeUTF(str);

                 

                dos.close();

                s.close();

            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-socket/400.html

  • 相关阅读:
    GDUFE ACM-1050
    hdu-2020
    hdu-2055
    hdu-2734
    GDUFE ACM-1145
    GDUFE ACM-1127
    GDUFE ACM-1126
    GDUFE ACM-1125
    GDUFE ACM-1124
    GDUFE ACM-1123
  • 原文地址:https://www.cnblogs.com/Lanht/p/12615441.html
Copyright © 2011-2022 走看看