1. 程式人生 > >socket程式設計--實現簡單的qq

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

結果:
在這裡插入圖片描述