java 聊天小程序_Java聊天小程序(多人)

初学Java,用到网络编程和多线程的相关知识编辑了一套聊天程序,仅供参考,多多包涵:

这是服务器:

package test;

import javax.swing.*;

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 java.util.HashMap;

import java.util.Map;

import java.util.concurrent.CopyOnWriteArrayList;

public class 服务器 {

public static void main(String[] args) {

服务器 ff = new 服务器();

try {

ff.WindowsChat();

} catch (IOException e) {

}

}

CopyOnWriteArrayList socket = new CopyOnWriteArrayList<>();

String a;int q;

BufferedReader h;

String c;

Mapmap=new HashMap<>();

Mapcolor=new HashMap<>();

public void WindowsChat() throws IOException {

ServerSocket ss = new ServerSocket(Integer.parseInt(JOptionPane.showInputDialog(null, "请输入群聊密钥", "666")));

String title;

JFrame jf=new JFrame();

new Thread().start();

new Thread(() -> {

Socket s;

while (true) {

try {

s = ss.accept();

this.socket.add(s);

this.h=new BufferedReader(new InputStreamReader(s.getInputStream()));

String aaa= h.readLine();

String bbb=h.readLine();

var i = "#000000\r\n"+"(" + aaa+ ")连线 (" + socket.size() + "人)\r\n";

map.put(s, aaa);

color.put(s, bbb);

for (Socket y : socket) {

try {

PrintWriter ll = new PrintWriter(y.getOutputStream());

ll.println(i);

ll.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

} catch (IOException e) { e.printStackTrace(); } } }).start();

while (true) {

this.q = socket.size();

for (Socket x : socket) {

new Thread(() -> {

while (true) {

try {

this.a = new BufferedReader(new InputStreamReader(x.getInputStream())).readLine() ;

socket.forEach(y -> {

try {

PrintWriter pp = new PrintWriter(y.getOutputStream());

pp.println(color.get(x)+"\r\n"+a );

pp.flush();

} catch (IOException e) {

e.printStackTrace();

}

});

} catch (IOException e) {

socket.remove(x);

for (Socket y : socket) {

try {

PrintWriter ii = new PrintWriter(y.getOutputStream());

ii.println("#000000\r\n("+map.get(x)+")下线 (" + socket.size() + "人)\r\n");

ii.flush();

} catch (IOException ex) {

}}

// }

Thread.currentThread().stop();

} } }).start(); }

while (true) {

if (socket.size() != q) break; } } }}

先开启服务器,再开启用户端

下面是用户端:

package test;

import javax.swing.*;

import javax.swing.event.DocumentEvent;

import javax.swing.event.DocumentListener;

import javax.swing.text.DefaultCaret;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Random;

import java.util.Scanner;

public class test22 extends JFrame implements KeyListener, ActionListener {

public static void main(String[] args) {

new test11().WindowsChat();

}

Socket s;

String name;

BufferedReader bf;

String c;

JTextField text = new JTextField();

JButton search = new JButton("发送");

JTextPane t = new JTextPane();

Random rand = new Random();

public void WindowsChat() {

try {

String a = JOptionPane.showInputDialog(this, "请输入对方ip", "192.168.3.209");

String b = JOptionPane.showInputDialog(this, "请输入密钥", "666");

this.s = new Socket(a, Integer.parseInt(b));

} catch (IOException ex) {

JOptionPane.showMessageDialog(null, "错误", "提示", JOptionPane.ERROR_MESSAGE);

return;

}

this.name = JOptionPane.showInputDialog(null, "登陆成功!请输入你的昵称", "傻狗" + rand.nextInt(100) + "号");

Object[]colors={"red#FF0000","black#000000","blue#0000FF","purple#800080","green#008000","orange#FFA500","pink#FFC0CB","yellow#FFFF00"};

this.c= JOptionPane.showInputDialog(null, "请输入你的字体颜色", "登陆成功!",-1,null, colors, colors[1]).toString();

String cc=c.substring(c.lastIndexOf("#"));

try {

PrintWriter po = new PrintWriter(s.getOutputStream());

po.println(name+"\r\n"+cc);

po.flush();

} catch (IOException e) {

e.printStackTrace();

}

setVisible(true);

setTitle("聊天系统(" + name + ")");

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

setLocationRelativeTo(null);

setSize(600, 750);

setResizable(false);

setLayout(null);

text.setBounds(10, 10, 510, 80);

search.setBounds(525, 10, 65, 80);

t.setFont(new Font("楷体", Font.BOLD, 20));

t.setBounds(10, 100, 570, 600);

t.setFocusable(false);//DefaultCaret caret = (DefaultCaret)this.t.getCaret();

// caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

add(text);

add(search);

add(t);

search.addActionListener(this);

new Thread(() -> {

while (true) {

try {this.bf=new BufferedReader(new InputStreamReader(s.getInputStream()));

String color=bf.readLine();

t.setForeground(Color.decode(color));

t.replaceSelection(bf.readLine() + "\r\n");

} catch (IOException e) {

JOptionPane.showMessageDialog(null, "服务器断线!");

System.exit(0);

}

}

}).start();

new Thread(() -> {

text.addKeyListener(this);

}).start();

}

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_ENTER&&!text.getText().equals("")) {

try {

PrintWriter pw = new PrintWriter(s.getOutputStream());

pw.println(name + ": " + text.getText() + "\r\n");

pw.flush();

text.setText("");

} catch (IOException ex) {

ex.printStackTrace();

}

}

}

@Override

public void keyReleased(KeyEvent e) {

}

@Override

public void actionPerformed(ActionEvent e) {

if (!text.getText().equals("")){

try {

PrintWriter pw = new PrintWriter(s.getOutputStream());

pw.println(name + ": " + text.getText() + "\r\n");

pw.flush();

text.setText("");

} catch (IOException ex) {

ex.printStackTrace();

}

}}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值