socket编程--实现简单的qq

socket编程–实现简单的qq

单向通信
服务器端:

    /**
     * 这是服务器端,让它在9999端口监听
     */
    package Test1netServer;
    import java.net.*;
    import java.io.*;
    
    public class MyServer {
    public static void main(String[]args){
        MyServer ms=new MyServer();
    }
    public MyServer(){
        try {
            //在9999端口监听
            ServerSocket ss=new ServerSocket(9999);
            System.out.println("我是服务器,我正在9999端口监听...");
            //等待某个客户端来连接,该函数会返回一个Socket
            Socket s=ss.accept();
            //接收客户端发来的信息
            InputStreamReader isr=new InputStreamReader(s.getInputStream());
            BufferedReader br=new BufferedReader(isr);

            String info=br.readLine();
            System.out.println("服务器接收到:"+info);

            //服务器对客户端作回应
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
            pw.println("你好客户端,我是服务器");

        } catch (IOException e) {
            e.printStackTrace();
        }
   }
}

客户端:

/**
* 这是客户端
*/
package Test1netClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MyClient {
public static void main(String []args){
    MyClient mc=new MyClient();
}
public MyClient(){
    try {
        //Socket()来连接某个服务器端 ip+端口号
        Socket s=new Socket("192.168.174.1",9999);

        //向服务器端发送数据,true表示即时刷新
        PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
        pw.println("你好服务器,我是客户端");

        //收到服务器的回应
        InputStreamReader isr=new InputStreamReader(s.getInputStream());
        BufferedReader br=new BufferedReader(isr);
        String response=br.readLine();
        System.out.println("客户端收到:"+response);

    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

结果:

MyServer:
我是服务器,我正在9999端口监听...
服务器接收到:你好,我是客户端
MyClient:
客户端收到:你好客户端,我是服务器

双向通信(一方说一句)

服务器端:

/**
 * 服务器
 * 通过控制台输入与客户端通信
 */
    package Test2netServer;
    
    import java.net.*;
    import java.io.*;
    
    public class MyServe2 {
    public static void main(String []args){
        MyServe2 ms2=new MyServe2();
    }
    public MyServe2(){
        try {
        //在9999端口监听
        ServerSocket ss=new ServerSocket(9999);
        System.out.println("我是服务器,正在等待连接...");
        //等待连接
        Socket s=ss.accept();

        InputStreamReader isr=new InputStreamReader(s.getInputStream());
        BufferedReader br=new BufferedReader(isr);
        //向客户端发送信息
        PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

        //接收从控制台输入信息
        InputStreamReader isr2=new InputStreamReader(System.in);
        BufferedReader br2=new BufferedReader(isr2);

        while(true){
        //接收客户端发来的信息
        String infoFromClient=br.readLine();
        System.out.println("服务器收到:"+infoFromClient);

        //向客户端发送从控制台输入的信息
        System.out.println("请输入对客户端发送的信息:");//提示
        pw.println(br2.readLine());
    //	if(br2.readLine().equals("bye")){
    //	System.out.println("服务器退出");
    //	s.close();
    //	break;
    //	}
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:

/**
* 客户端
* 通过在控制台输入信息向服务器发送
*/
package Test2netClient;
import java.io.*;
import java.net.*;

public class MyClient2 {
public static void main(String []args){
    MyClient2 mc2=new MyClient2();
}
public MyClient2(){
    try {
        //连接服务器
        Socket s=new Socket("192.168.174.1",9999);

        //从控制台输入信息
        InputStreamReader isr=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(isr);

        //发送给服务器
        PrintWriter pw=new PrintWriter(s.getOutputStream(),true);

        //收到回应
        InputStreamReader isr2=new InputStreamReader(s.getInputStream());
        BufferedReader br2=new BufferedReader(isr2);

        while(true){
            //将控制台输入的信息发给服务器
            System.out.println("请输入信息发给服务器:");//提示
                pw.println(br.readLine());
//              if(br.readLine().equals("bye")){
//              System.out.println("客户端退出");
//              s.close();
//              break;
//              }

            //收到服务器的回应
            String resFromServer=br2.readLine();
            System.out.println("收到回应:"+resFromServer);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

结果:

MyServer2:
我是服务器,正在等待连接...
服务器收到:你好服务器,我是客户端
请输入对客户端发送的信息:
你好客户端,我是服务器
服务器收到:123
请输入对客户端发送的信息:
456

MyClient2:

请输入信息发给服务器:
你好服务器,我是客户端
收到回应:你好客户端,我是服务器
请输入信息发给服务器:
123
收到回应:456
请输入信息发给服务器:

实现简易版qq

服务端:

package Test5netServer;
    /**
     * 全双工服务器端,让它在9999端口监听
     * 可以接收客户端发来的数据
     */
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class MyServer5 extends JFrame implements ActionListener {
    JTextArea jta;
    JTextField jtf;
    JButton jb;
    JPanel jp1;
    JScrollPane jsp;

    InputStreamReader isr;
    BufferedReader br;
    PrintWriter pw;

    public static void main(String[] args) {
        new MyServer5();
    }

    //构造函数
    public MyServer5() {
        jta = new JTextArea();
        jtf = new JTextField(20);
        jb = new JButton("发送");
        jb.addActionListener(this);
        //给jb发送按钮添加快捷键(回车)事件
        jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
        jb.getActionMap().put("fasong", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                String info = jtf.getText();
                jta.append("服务端 对 客户端说:" + info + "\r\n");
                pw.println(info);
                jtf.setText("");
            }
        });

        jp1 = new JPanel();
        jp1.add(jtf);
        jp1.add(jb);
        jsp = new JScrollPane(jta);
        this.add(jsp, "Center");
        this.add(jp1, "South");
        this.setTitle("qq简易聊天--服务端");
        this.setSize(350, 250);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        try {
            //在9999号端口上监听
            ServerSocket ss = new ServerSocket(9999);
            //等待客户端连接
            Socket s = ss.accept();
            //读取从客户端发来的信息
            isr = new InputStreamReader(s.getInputStream());
            br = new BufferedReader(isr);
            pw = new PrintWriter(s.getOutputStream(), true);
            while (true) {
                //读取从客户端发来的信息
                String info = br.readLine();
                jta.append("客户端 对 服务端说:" + info + "\r\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (pw != null) pw.close();
                if (br != null) br.close();
                if (isr != null) isr.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //如果用户按下发送信息的按钮
        if (e.getSource() == jb) {
            //把服务器在jtf写的 内容发送给客户端
            String info = jtf.getText();
            //向jta中不断追加内容
            jta.append("服务端 对 客户端说:" + info + "\r\n");
            pw.println(info);
            //清空jtf内容
            jtf.setText("");
        }
    }
}

客户端:

package Test5netClient;

/**
 * 这是一个客户端程序,可以连接服务器端口9999
 */

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class MyClient5 extends JFrame implements ActionListener{
JTextArea jta;
JTextField jtf;
JButton jb;
JPanel jp1;
JScrollPane jsp;

InputStreamReader isr;
BufferedReader br;
PrintWriter pw;

public static void main(String[] args) {
    new MyClient5();
}

public MyClient5(){
    jta=new JTextArea();
    jtf=new JTextField(20);
    jtf.setFocusable(true);
    jb=new JButton("发送");
    jb.addActionListener(this);
    //给jb发送按钮添加快捷键(回车)事件
    jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
    jb.getActionMap().put("fasong", new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            String info=jtf.getText();
            jta.append("客户端 对 服务端说:"+info+"\r\n");
            pw.println(info);
            jtf.setText("");
        }
    });

    jp1=new JPanel();
    jp1.add(jtf);
    jp1.add(jb);
    jsp=new JScrollPane(jta);
    this.add(jsp,"Center");
    this.add(jp1,"South");

    this.setTitle("qq简易聊天--客户端");
    this.setSize(350, 250);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);

    try {
        //Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip
        Socket s=new Socket("127.0.0.1",9999);

        InputStreamReader isr=new InputStreamReader(s.getInputStream());
        BufferedReader br=new BufferedReader(isr);
        pw=new PrintWriter(s.getOutputStream(),true);
        while(true){
            //读取服务器端发来的信息
            String info=br.readLine();
            jta.append("服务端 对 客户端说:"+info+"\r\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        try {
            if(pw!=null) pw.close();
            if(br!=null) br.close();
            if(isr!=null) isr.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource()==jb){
        String info=jtf.getText();
        jta.append("客户端 对 服务端说:"+info+"\r\n");
        pw.println(info);
        jtf.setText("");
    }
}
}

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mys_mys/article/details/83713645