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

}

}

时间: 2024-08-09 02:19:19

IT十八掌作业_java基础第十六天_GUI/socket的相关文章

IT十八掌作业_java基础第十四天_IO

1.定义函数,输出一个byte的二进制字符串. 2.定义工具类,完成int数和byte[]之间的相互转换. 3.阐述IO流. 输入输出流 字符字节流 缓冲和非缓冲流 转换流. 4.通过File对象打印输出指定路径下的整个目录树结构. 5.完成文件夹复制. --------------------------------------------- 1. package com.it18zhang.day14; public class ByteToBin { public static void

IT十八掌作业_java基础第十五天_IO串行化/深度复制

1.使用RandomAccessFile实现文件合成. 2.使用java中的串行化技术实现对象图(100只猫Cat集合,但是Cat的owner不需要串行化)的深度复制. 3.阐述串行化的过程,应用场景,串行ID的用途. 1. package com.it18zhang; /** * 将分割的文件进行合成 */ import java.io.File; import java.io.FileInputStream; import java.io.RandomAccessFile; public c

IT十八掌作业_java基础第十天_集合

1.remove(int index); //删除指定位置的元素 2.remove(Object o); //删除指定对象,考查删除对象的规则是什么? 3.removeAll(Collection col);//删除指定集合中的所有元素. 4.contains(Object o); //是否包含 5.contains(Collection col);//是否包含集合. ----------------------------------------------------------------

IT十八掌作业_java基础第26天_Java基础总结/虚拟机基础

感谢大家对IT十八掌大数据的支持,今天的作业如下: 巩固java基础知识,安装虚拟机! --------------------------------------------------------------------------------------------------------答案略,自行练习

IT十八掌作业_java基础第八天_多线程

感觉大家对IT十八掌大数据的支持,今天的作业如下 1. 5辆汽车过山洞,依次经过山洞.每辆车通过山洞花费10秒,使用多线程实现. 2. 用多线程模拟蜜蜂和熊的关系. 蜜蜂是生产者,熊是消费者.蜜蜂生产蜂蜜是累加的过程,熊吃蜂蜜是批量(满100吃掉)的过程. 生产者和消费者之间使用通知方式告知对方.注意不能出现死锁的现象.

IT十八掌作业_java基础第25天_NIO

感谢大家对IT十八掌大数据的支持,今天的作业如下: 1.将NIO中的Socket通信过程使用图形进行描述和说明. 2.画图说明Runtime data area的内部结构. 3.阐述class的类加载过程. 4.反射和内省的异同,以及各自的优缺点. 5.阐述jvm中从堆和非堆的角度阐述jvm的内存结构.

IT十八掌作业_java基础第十七天_QQ案例

感谢大家对IT十八掌大数据的支持,今天的作业如下: 按照老师讲的,自己练习项目

IT十八掌作业_java基础第23天_数据库连接池\反射

感谢大家对IT十八掌大数据的支持,今天的作业如下: 1.属性赋值 ------------- 1.Man{50+ } Man man = new Man(); man.setXxx1(...); man.setXxx2(...); ... 50 Man copy = new Man(); copy = man ; copy.setXxx1(man.getXxx1()); copy.setXxx1(man.getXxx1()); copy.setXxx1(man.getXxx1()); copy.

IT十八掌作业_java基础第九天_多线程、自动拆装箱

1.蜜蜂和熊的生产消费关系,熊在蜂蜜满10斤吃掉.蜜蜂一次生产一斤蜂蜜,且蜜蜂生成一斤蜂蜜花费的时间是10s. 十只蜜蜂和两只熊. class Bee extends Thread{ private int bag; private static final int BAG_MAX = 20; private static final int ONCE = 5; private static final int TIME = 10 ; private Box box; private Strin