zoukankan      html  css  js  c++  java
  • java中关于Socket类通信的基本测试程序

    java中Socket类可以进行一些服务器与客户机通信之类的工作,这一点虽然并不算很是高明,对于一个学习java的新手,能够灵活使用Socket类编写出简单的网络聊天程序,这一点是必须达到的能力要求!Socket一共有两个类比较重要:一类是用于服务器端的ServerSocket类,另外一类是客户端的Socket类。

    Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通讯。这里就介绍一下在Java中如何利用Socket进行网络编程。

    一、建立服务器类

    Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。

    ServerSocket server = new ServerSocket(10000)


    这条语句创建了一个服务器对象,这个服务器使用10000号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。

    Socket incoming = server.accept()


    进而得到输入流和输出流,并进行封装

    BufferedReader in = new BufferedReader(new
    InputStreamReader(incoming.getInputStream()));
    PrintWriter out = new PrintWriter(incoming.getOutputStream(),true);


    随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。

    在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用

    out.close();
    in.close();

    二、建立客户端代码

    相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用"建立服务器"部分介绍的方法实现数据的输入和输出。

    Socket socket = new Socket("127.0.0.1",10000);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out = new PrintWriter(socket.getOutputStream(),true);


    以上的程序代码建立了一个Socket对象,这个对象连接到ip地址为127.0.0.1(默认地址)的主机上、端口为10000的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。

    三、建立用户界面

    读者可以根据自己的喜好建立自己的用户界面,这不是本文的重点。

    经过以上三个步骤,就可以建立一个比较简单的对话程序。下面是我写的一个程序:有心的朋友可以自己运行一下

    package rick_demo;

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
     
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Locale;
    import java.util.TimeZone;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;

    public class Test extends JFrame{

        /**@author Rick
         * the class is about how to communicate by socket ,the UI is
         * friendly with swing ,and Multi-threading technology is
         * useful when you want to the program  respond you in time
         * and this <code>Test</code> is use as client
         */
        private static final long serialVersionUID = 1L;
        private Pane pan;
        private Container c= new Container();
        public Test(){
            this.setSize(200, 200);
              pan = new Pane();
              c=this.getContentPane();
              c.add(pan);
              c.setBackground(Color.black);
              c.setForeground(Color.white);
              c.setVisible(true);
              this.setVisible(true);
        }
        public static void main(String[] args){        
            SocketDemo sd= new SocketDemo();
            sd.setDaemon(true);  //将服务器线程设为后台线程
            sd.start();    //要比客户机程序先启动服务器程序
            new Test();
        }
        
    }
    class Pane extends JPanel{    
        /**
         *
         */
        private static final long serialVersionUID = 5089011654522261240L;
        private Socket ss ;
        private JTextArea ta=  new JTextArea(20,10);
        private JScrollPane jp = new JScrollPane(ta);
        private static JTextField  tf= new JTextField(15);
        private PrintWriter  out ;
        private BufferedReader in;
        private static String  str=new String();  //获得输入框的文字
        private String  date = new String();
     
        private SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault()) ;
        private JPanel demo= new JPanel();
        private JButton  btn = new JButton("发送");
        public Pane(){
            this.setSize(new Dimension(200,200));
            this.setLayout(new BorderLayout());
            add(jp,BorderLayout.CENTER);
            demo.setSize(new Dimension(200,10));
            demo.add(tf);
            demo.add(btn);
            add(demo,BorderLayout.SOUTH);
            df.setTimeZone(TimeZone.getTimeZone("GMT+8"));//reset the time zone
            
            this.setVisible(true);
            btn.addActionListener(new JianTing());
            btn.addKeyListener(new JianTing());
            tf.addKeyListener(new JianTing());
            ta.addKeyListener(new JianTing());
        }
        public static String getString(){
            str = tf.getText();
            return str;
        }
        private class JianTing implements ActionListener,KeyListener {
            public void actionPerformed(ActionEvent e){
                
                if(e.getSource()==btn){
                     str=  Pane.getString();
                    date= df.format(Calendar.getInstance().getTime());
                     ta.append(date+"\n 客户机:"+str+"\n");
                     
               
                         try {
                            ss= new Socket("127.0.0.1",10000);
                            out = new PrintWriter(ss.getOutputStream(),true);
                            out.println(str);
                            in = new BufferedReader
                                (new InputStreamReader(ss.getInputStream()));
                            ta.append(date+"\n 服务器:"+in.readLine()+"\n");
                            System.out.println("服务器说:"+in.readLine());
                            in.close();
                            out.close();
                            ss.close();
                        } catch (UnknownHostException e1) {                
                            e1.printStackTrace();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                        
            
                }
            }
             public void keyPressed(KeyEvent e){  //和actionPerformed方法内容完全一样!
                if(e.getKeyCode()==KeyEvent.VK_ENTER){
                    System.out.println("hello ");
                     str=  Pane.getString();
                        date= df.format(Calendar.getInstance().getTime());
                         ta.append(date+"\n 客户机:"+str+"\n");
                         
                   
                             try {
                                ss= new Socket("127.0.0.1",10000);
                                out = new PrintWriter(ss.getOutputStream(),true);
                                out.println(str);
                                in = new BufferedReader
                                    (new InputStreamReader(ss.getInputStream()));
                                ta.append(date+"\n 服务器:"+in.readLine()+"\n");
                                System.out.println("服务器说:"+in.readLine());
                                in.close();
                                out.close();
                                ss.close();
                            } catch (UnknownHostException e1) {                
                                e1.printStackTrace();
                            } catch (IOException e1) {
                                e1.printStackTrace();
                            }
                }        
            }
            public void keyReleased(KeyEvent e){
            }
            public void keyTyped(KeyEvent e){            
            }   
        }
        
    }
    /**
     * 服务器类只负责接受信息和发送信息,不做其他事
     */
     
    class SocketDemo extends Thread{
        private  ServerSocket  ss ;
        private  Socket  s1;
        private  PrintWriter out1;
        //private  BufferedReader tempOut;
        private  BufferedReader in1;
        public void run(){
            while(true){
             try{
                ss= new ServerSocket(10000);
                s1=ss.accept();
                System.out.println("successfully connect the server now ");  
                /*send the data to the client machine */
                //tempOut = new BufferedReader(new InputStreamReader(s1.getInputStream()));
                out1 = new PrintWriter(s1.getOutputStream(),true);
                out1 .println("已经收到你的信息");
                /*receive the data from client machine*/
                in1= new BufferedReader(new InputStreamReader(s1.getInputStream()));
                System.out.println(in1.readLine());            
                in1.close();
                out1.close();
                //tempOut.close();
                ss.close();
             }catch(IOException e){        
             }  
            }
        }
     }



  • 相关阅读:
    pyinstaller 打包后无法运行
    Android Uiautomator2 gradlew 坑
    JNDI 在 J2EE 中的角色
    23种设计模式
    Struts2工作原理
    SpringMVC工作原理
    堆内存设置
    安装和使用 memcached
    SQL面试题及答案
    30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3071842.html
Copyright © 2011-2022 走看看