日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IT十八掌作业_java基础第十六天_GUI/socket

發布時間:2025/3/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IT十八掌作业_java基础第十六天_GUI/socket 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


參照視頻,編寫出聊天程序。

知識點分析:

Socket + GUI ?+ IO = ?簡版QQ

------------------------------

1.GUI

2.Socket

ServerSocket : port + accept?


Socket sock ?= accept();

//更新窗口


//接收client的數據

new Thread(){

run(){

sock..getInputStream();

....

//更新窗口

}

}.start()


3.在分線程中完成ServerSocket推送消息給所有客戶端。

List<OutputStream> ... = ;

4.推送聯系人列表給所有客戶端。








-------------------------------------------------------------------------------------------

package com.it18zhang.QQDemo;


public class App {


public static void main(String[] args) {

//創建窗口

MyWindow w = new MyWindow();

//消息服務器

MessageServer server = new MessageServer(w);

//啟動消息服務器

server.start(1234);

}


}

package com.it18zhang.QQDemo;


import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;


public class ClientDemo {


public static void main(String[] args) throws Exception {

Socket s = new Socket("localhost",1234);

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream(),"gbk"));

bw.write("TCP hello!");

s.close();

}


}

package com.it18zhang.QQDemo;


import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JList;

import javax.swing.JTable;

import javax.swing.JTextArea;

import javax.swing.table.AbstractTableModel;

import javax.swing.table.TableModel;


public class MyWindow extends JFrame {


private static final long serialVersionUID = 6142786986925220872L;


// 歷史記錄

private JTextArea taHistory;

// 發送內容

private JTextArea taContent;

// 發送按鈕

private JButton btnSend;

// 聯系人列表

private JList listContacts;

private JTable table;


// 初始化窗體

public MyWindow() {

ini();

}


// 初始化動作

private void ini() {

// 設置邊界大小,位置

this.setSize(600, 400);

this.setLocation(200, 200);


// 設置為絕對布局

this.setLayout(null);


// 設置聯系人表格

table = new JTable();

table.setBounds(500, 0, 100, 400);

this.add(table);


// 設置聊天記錄區

taHistory = new JTextArea();

taHistory.setEditable(false);

taHistory.setBounds(0, 0, 480, 300);

this.add(taHistory);


this.setVisible(true);


// 添加監聽事件

this.addWindowListener(new WindowAdapter() {

public void windowClosed(WindowEvent e) {

System.exit(-1);

}

});


}

/**

* 刷新聯系人

*/

public void refreshContacts(final List<String> clients){

Set<String> set = new HashSet<String>(clients);

final List<String> newclients = new ArrayList<String>(set);

TableModel dataModel = new AbstractTableModel() {

public Object getValueAt(int row, int col) {

return newclients.get(row);

}

public int getRowCount() {

return newclients.size();

}

public int getColumnCount() {

return 1;

}

};

table.setModel(dataModel);

}

/**

* 更新聊天記錄

*/

public void updateHistory(String addr, String line) {

//原文

String old = taHistory.getText();

StringBuilder builder = new StringBuilder();

builder.append(old);

builder.append("\r\n");

builder.append(addr);

builder.append("\r\n");

builder.append(line);

builder.append("\r\n");

//更新聊天區域

taHistory.setText(builder.toString());

}


}

package com.it18zhang.QQDemo;


import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;


/**

?* 消息服務器

?*/

public class MessageServer {

//定義客戶端集合,

private List<String> clients = new ArrayList<String>();

private MyWindow window;

public MessageServer(MyWindow window) {

this.window = window;

}

//啟動服務器

public void start(int port){

try {

ServerSocket ss = new ServerSocket(port);

System.out.println("服務器啟動了");

InetAddress remAddr ;

int remPort;

while(true){

final Socket sock = ss.accept();

System.out.println(SocketUtil.getAddr(sock)+" : connected");

new MessageReceiverThread(window,sock).start();

remAddr = sock.getInetAddress();

remPort = sock.getPort();

//添加客戶端對象

clients.add(SocketUtil.getAddr(sock));

//刷新列表

window.refreshContacts(clients);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

package com.it18zhang.QQDemo;


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.Socket;


/**

?* 消息接收線程

?*/

public class MessageReceiverThread extends Thread {

private MyWindow window ;

private Socket sock ;

public MessageReceiverThread(MyWindow window, Socket sock) {

this.window = window;

this.sock = sock;

}

public void run(){

while(true){

try {

BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));

String line = null;

while((line = br.readLine()) != null){

window.updateHistory(SocketUtil.getAddr(sock),line); //更新歷史列表

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

package com.it18zhang.QQDemo;


import java.net.Socket;


public class SocketUtil {

/**

* 返回地址串

*/

public static String getAddr(Socket sock){

String ip = sock.getInetAddress().getHostAddress();

String ip0 = ip.substring(ip.lastIndexOf(".")+1);

return ip0+":"+sock.getPort();

}

}


轉載于:https://blog.51cto.com/liubx/1791479

總結

以上是生活随笔為你收集整理的IT十八掌作业_java基础第十六天_GUI/socket的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。