socket程式設計--實現簡單的qq
阿新 • • 發佈:2018-11-12
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("");
}
}
}
結果: