今天用到的知识点归纳:
服务端:
1、
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {//匿名内部类
public void run() {
try {
Server frame = new Server();//构造一个服务对象
frame.setVisible(true);// setVisible(boolean b) 根据参数 b
// 的值显示或隐藏此 Window。
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
2、类 ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
accept()
侦听并接受到此套接字的连接。
close()
关闭此套接字。
getInetAddress()
返回此服务器套接字的本地地址。
toString()
作为 String 返回此套接字的实现地址和实现端口。
3、类 JButton
JButton btnNewButton = new JButton(“启动服务”);//JButton(String text) 创建一个带文本的按钮。
4、接口 Runnable
run()
使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
5、
try {
sockets = new HashMap<>();//初始化服务
ServerSocket server = new ServerSocket(8080);// 开一个服务
System.out.println("服务器启动");
while (isRunning) {
Socket socket = server.accept();// 等待客户端连接
System.out.println("客户端连接进来" + socket.getInetAddress().getHostAddress());// 客户端连接进来
String ip = socket.getInetAddress().getHostAddress();// 得到客户端的ip
sockets.put(ip, socket);// 将连接的ip导入
ServerRead sr = new ServerRead(socket, Server.this);
Thread thread = new Thread(sr);
thread.start();
} catch (IOException e1) {
e1.printStackTrace();
}
Thread t = new Thread(run);// 定义一个线程,将run方法穿进去
t.start();// 实现该线程
6、接口 Iterator
hasNext()
如果仍有元素可以迭代,则返回 true。
E next()
返回迭代的下一个元素。
/** 将信息放到界面上 */
public void readLine(String line) {
JSONObject obj = JSONObject.fromObject(line);
String type = obj.getString("type");
if (type.equals("toSingle")) {
String msg = obj.getString("message");
String to = obj.getString("to");
String from = obj.getString("from");
String time = obj.getString("time");
Socket toSocket = sockets.get(to);
try {
OutputStream os = toSocket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(msg + "\n");
bw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
modle.addElement(line);//addElement(Object obj)
//将指定组件添加到此类表的末尾。
}
/** 服务器发送的信息 */
public void write(String msg) {
try {
Set<String> keys = sockets.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
Socket socket = sockets.get(it.next());
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
System.out.println("服务器发送信息");
bw.write(msg + "\n");
bw.flush();
textField.setText("");//发送出去后清空写字栏
}
} catch (IOException e) {
e.printStackTrace();
}
}
客户端:
//连接服务器
JButton button_1 = new JButton("连接服务器");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
System.out.println("连接服务器");
socket = new Socket("192.168.0.66", 8080);
System.out.println("连接服务器成功");
Thread t = new Thread(new ClientRead(Client.this));
t.start();
//发送按钮,读收到信息
JButton button = new JButton("发送");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String msg = creatMessage();
write(msg);
}
});
/** 返回一个发送给所有人的信息*/
public String creatMessage() {
String msg = textArea.getText();
JSONObject obj = new JSONObject();
obj.put("message", msg);
obj.put("type", "toSingle");
Calendar calendar = Calendar.getInstance();
long time = calendar.getTimeInMillis();
obj.put("time", "" + time);
obj.put("from", socket.getInetAddress().getHostAddress());
obj.put("to", "192.168.0.66");
System.out.println(obj.toString());
return obj.toString();
}
/**将此信息发送给服务器 msg是即将发送的信息*/
public void write(String msg) {
try {
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(new BufferedWriter(osw));
bw.write(msg + "\n");
bw.flush();
textArea.setText("");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
SercerRead类
public class ServerRead implements Runnable {
private Socket socket;
private Server server;
public ServerRead(Socket socket,Server server) {
this.server = server;
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();//监听连接进来的客户,读字节
InputStreamReader isr = new InputStreamReader(is);//读字符
BufferedReader br = new BufferedReader(isr);//读一行
while(true){
String line = br.readLine();
server.readLine(line);
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ClientRead
public class ClientRead implements Runnable {
private Client client;
public ClientRead(Client client) {
this.client = client;
}
@Override
public void run() {
while (true) {
client.read();
}
}
}