Java--Socket通訊(雙向,有介面)
服務端:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
public class ChatFrameServer{
private PrintWriter pw;
private JFrame frame;
private JPanel pane_buttom;
private JSplitPane pane_center;
//顯示內容的文字框,輸入內容的文字框,傳送內容按鈕
private JScrollPane pane_showWindow;
private JScrollPane pane_inputWindow;
private JTextArea area_showWindow;
private JTextArea area_inputWindow;
private JButton btn_send;
private Dimension dimension;//用於設定area_showWindow可拖拉的大小
//初始化
public ChatFrameServer() {
frame = new JFrame();
pane_buttom = new JPanel();
pane_showWindow = new JScrollPane();
pane_inputWindow = new JScrollPane();
area_showWindow = new JTextArea();
area_inputWindow = new JTextArea();
pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow);
btn_send = new JButton("傳送");
dimension = new Dimension(50, 300);
}
//呼叫方法顯示視窗
public void showFrame(){
initFrame();
initChatTextArea();
initButton();
btn_send();
socket();
}
//主窗體
public void initFrame(){
frame.setTitle("服務端");
int width = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int height = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setBounds(width / 2, height / 2, 400, 450);
frame.setVisible(true);
}
//內容顯示文字框和輸入內容文字框
private void initChatTextArea(){
//取得檢視焦點
pane_showWindow.getViewport().add(area_showWindow);
pane_inputWindow.getViewport().add(area_inputWindow);
//將顯示文字域設定為不可編輯
area_showWindow.setEditable(false);
//設定顯示文字域可拖拉的大小
pane_showWindow.setMinimumSize(dimension);
frame.add(pane_center, BorderLayout.CENTER);
}
//傳送檔案,傳送內容按鈕
public void initButton(){
pane_buttom.add(btn_send);
frame.add(pane_buttom, BorderLayout.SOUTH);
}
private void btn_send(){
btn_send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String info = area_inputWindow.getText();
area_showWindow.append("服務端:"+info+"\r\n");
pw.println(info);
area_inputWindow.setText("");
}
});
}
private void socket(){
ServerSocket ss;
try {
ss = new ServerSocket(9988);
//等待連線 客戶端
Socket s=ss.accept();
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
//PrintWriter必須和socket有密切的關係
pw=new PrintWriter(s.getOutputStream(),true);
//讀取從客戶端法發來的資訊
while(true) {
//讀取從客戶端發來的資訊
String info=br.readLine();
//在文字欄裡顯示
area_showWindow.append("客戶端:"+info+"\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ChatFrameServer chat = new ChatFrameServer();
chat.showFrame();
}
}
客戶端:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
public class ChatFrame{
private PrintWriter pw;
private JFrame frame;
private JPanel pane_buttom;
private JSplitPane pane_center;
//顯示內容的文字框,輸入內容的文字框,傳送內容按鈕
private JScrollPane pane_showWindow;
private JScrollPane pane_inputWindow;
private JTextArea area_showWindow;
private JTextArea area_inputWindow;
private JButton btn_send;
private Dimension dimension;//用於設定area_showWindow可拖拉的大小
//初始化
public ChatFrame() {
frame = new JFrame();
pane_buttom = new JPanel();
pane_showWindow = new JScrollPane();
pane_inputWindow = new JScrollPane();
area_showWindow = new JTextArea();
area_inputWindow = new JTextArea();
pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow);
btn_send = new JButton("傳送");
dimension = new Dimension(50, 300);
}
//呼叫方法顯示視窗
public void showFrame(){
initFrame();
initChatTextArea();
initButton();
btn_send();
socket();
}
//主窗體
public void initFrame(){
frame.setTitle("客戶端");
int width = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int height = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setBounds(width / 2, height / 2, 400, 450);
frame.setVisible(true);
}
//內容顯示文字框和輸入內容文字框
private void initChatTextArea(){
//取得檢視焦點
pane_showWindow.getViewport().add(area_showWindow);
pane_inputWindow.getViewport().add(area_inputWindow);
//將顯示文字域設定為不可編輯
area_showWindow.setEditable(false);
//設定顯示文字域可拖拉的大小
pane_showWindow.setMinimumSize(dimension);
frame.add(pane_center, BorderLayout.CENTER);
}
//傳送檔案,傳送內容按鈕
public void initButton(){
pane_buttom.add(btn_send);
frame.add(pane_buttom, BorderLayout.SOUTH);
}
private void btn_send(){
btn_send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String info = area_inputWindow.getText();
area_showWindow.append("客戶端: "+info+"\r\n");
pw.println(info);
area_inputWindow.setText("");
}
});
}
private void socket(){
try {
Socket s = new Socket("127.0.0.1",9988);
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);
while(true){
//不停地讀取從伺服器端發來的資訊
String info=br.readLine();
area_showWindow.append("服務端: "+info+"\r\n");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ChatFrame chat = new ChatFrame();
chat.showFrame();
}
}
相關文章
- UDP雙向通訊UDP
- 雙向通訊之websocketWeb
- 雙向通訊之SSE
- Android AIDL SERVICE 雙向通訊 詳解AndroidAI
- 雙向迭代介面:ListIterator
- 高效能USB轉串列埠介面卡,讓USB和序列介面輕鬆實現雙向通訊!串列埠
- uni-app上下級頁面資料雙向通訊APP
- Android中通過Messenger與Service實現程式間雙向通訊AndroidMessenger
- Channel: flutter平臺層與執行層的雙向通訊Flutter
- WCF雙工通訊
- vue 自定義元件 v-model雙向繫結、 父子元件同步通訊Vue元件
- 全雙工通訊的 WebSocketWeb
- 高精度原子鐘,雙向通訊,俄將接入我國北斗衛星系統
- 【vue元件通訊①】父元件向子元件通訊propsVue元件
- MCU的SPI通訊介面
- 如何打通 SAP Cloud for Customer 系統和微信公眾號的雙向訊息通訊功能Cloud
- 雙向連結串列介面設計(C語言)C語言
- 單工,半雙工,全雙工通訊區別
- Linux開發板(樹莓派)和伺服器進行雙向通訊(socket)Linux樹莓派伺服器
- React跟Vue不同 沒有雙向繫結ReactVue
- 雙向迴圈連結串列的介面設計(初版
- API介面通訊引數規範API
- 串列埠通訊gui介面顯示串列埠GUI
- 樂訊通雲通訊:物聯網路卡有哪些功能
- 自定義雙向迴圈連結串列基本函式介面函式
- 程式間通訊方式有哪些?
- VUE 元件間通訊---單向資料流Vue元件
- Vue.js子元件向父元件通訊Vue.js元件
- 雲控平臺的雙向音訊解決方案音訊
- API介面通訊引數規範(2)API
- 通過原生js實現資料的雙向繫結JS
- Tornado 4.3文件翻譯: web框架-websocket瀏覽器與伺服器雙向通訊Web框架瀏覽器伺服器
- 有向圖的連通性(判強連通)
- vue 雙向繫結(v-model 雙向繫結、.sync 雙向繫結、.sync 傳物件)Vue物件
- 樂訊通雲通訊:物聯網路卡有什麼優點
- 串列埠通訊與其他通訊方式相比有什麼優勢?串列埠
- 雙向lstm原理
- 客戶端與伺服器之間雙向通訊的5種方式總結(完整程式碼演示)客戶端伺服器