要实现 Java 的一对一聊天室,可以使用 Socket 编程实现基于 TCP 协议的通信。
以下是一些大致的步骤:
创建服务器端程序:创建一个服务器端程序,等待客户端的连接请求。在连接请求到来时,服务器会创建一个新的线程来处理这个连接请求。
创建客户端程序:创建一个客户端程序,连接服务器端程序。在连接成功后,客户端可以发送消息给服务器,服务器会将这些消息转发给接收方。
实现消息传输:在客户端和服务器之间,通过输入流和输出流传输数据。客户端向服务器发送消息时,使用输出流将消息发送给服务器;服务器收到消息后,使用输入流读取消息内容。
实现一对一通信:当客户端和服务器建立连接后,可以通过指定接收方的用户名来实现一对一通信。客户端向服务器发送消息时,需要指定接收方的用户名,服务器将根据用户名查找对应的客户端,并将消息发送给指定的客户端。
实现界面交互:可以使用 JavaFX、Swing 等图形界面库,实现聊天窗口的显示和用户的输入。用户在聊天窗口中输入消息后,客户端将消息发送给服务器,服务器将消息转发给接收方。
需要注意的是,为了保证通信的可靠性和安全性,需要对数据进行加密和校验,同时也需要考虑并发访问的问题,防止多个线程同时访问导致数据错乱的情况发生。
两个类,实现交互import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.io.PrintWriter
import java.net.ServerSocket
import java.net.Socket
public class MutiChat
{
public static void main(String[] args)
{
MutiChat mc = new MutiChat()
mc.receive().start()
mc.send().start()
}
/**
* 接收信息
*
* @return
*/
private Thread receive()
{
return new Thread()
{
public void run()
{
ServerSocket server_socket = null
Socket sk = null
BufferedReader in = null
try
{
server_socket = new ServerSocket(7777)
sk = server_socket.accept()
in = new BufferedReader(new InputStreamReader(sk
.getInputStream()))
while (true)
{
String str = in.readLine()
System.out.println(str)
}
} catch (Exception e)
{
e.printStackTrace()
}
}
}
}
private Thread send()
{
return new Thread()
{
public void run()
{
Socket client_socket = null
BufferedReader in = null
PrintWriter out = null
while (true)
{
try
{
client_socket = new Socket("127.0.0.1", 8888)
in = new BufferedReader(
new InputStreamReader(System.in))
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client_socket
.getOutputStream())), true)
while (true)
{
String str = in.readLine()
out.println(str)
}
} catch (Exception e)
{
try
{
Thread.sleep(1000)
} catch (Exception ex)
{
ex.printStackTrace()
}
}
}
}
}
}
}
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.io.PrintWriter
import java.net.ServerSocket
import java.net.Socket
public class MutiChat2
{
public static void main(String[] args)
{
MutiChat2 mc = new MutiChat2()
mc.receive().start()
mc.send().start()
}
/**
* 接收信息
*
* @return
*/
private Thread receive()
{
return new Thread()
{
public void run()
{
ServerSocket server_socket = null
Socket sk = null
BufferedReader in = null
try
{
server_socket = new ServerSocket(8888)
sk = server_socket.accept()
in = new BufferedReader(new InputStreamReader(sk
.getInputStream()))
while (true)
{
String str = in.readLine()
System.out.println(str)
}
} catch (Exception e)
{
e.printStackTrace()
}
}
}
}
private Thread send()
{
return new Thread()
{
public void run()
{
Socket client_socket = null
BufferedReader in = null
PrintWriter out = null
while (true)
{
try
{
client_socket = new Socket("127.0.0.1", 7777)
in = new BufferedReader(
new InputStreamReader(System.in))
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client_socket
.getOutputStream())), true)
while (true)
{
String str = in.readLine()
out.println(str)
}
} catch (Exception e)
{
try
{
Thread.sleep(1000)
} catch (Exception ex)
{
ex.printStackTrace()
}
}
}
}
}
}
}
import java.io.*import java.net.*
import java.awt.*
import javax.swing.*
import java.awt.event.*//引入包。
public class ChatClient {
public static void main(String[] args) {
ChatClient cc = new ChatClient()
cc.receive()
}
JTextField jtf// 文本条
JTextArea jta//文本域。
Socket s//客户端
PrintWriter out//输出流
BufferedReader in//输入流
public ChatClient() {
JFrame frame = new JFrame("ChatClient")//窗口
frame.setSize(400, 300)//大小
jta = new JTextArea()//文本域
jta.setEditable(false)//不可编辑
jtf = new JTextField()//文件条
jtf.addActionListener(new ActionListener() { //添加监听。
public void actionPerformed(ActionEvent arg0) {
send()//调用send()方法
}
})
frame.getContentPane().add(new JScrollPane(jta))//添加滚动条
frame.getContentPane().add(jtf, "South")//添加文本条
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)//关闭窗口。
frame.setVisible(true)//可显示的。
try {
s = new Socket("127.0.0.1", 9000)//连接服务端 socket("主机名",端口号)
in = new BufferedReader(new InputStreamReader(s.getInputStream()))//建立输入流
out = new PrintWriter(s.getOutputStream())//输出流
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace()
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
}
public void receive() { //接受服务端发来别的客户端的信息。
while (true) {
try {
String text = in.readLine()//读一行
this.jta.append(text + "\n")//jta 添加上读入的。
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace()
return
}
}
}
public void send() { //发送消息
String text = this.jtf.getText()//得到你输入的消息
this.jtf.setText("")//在文本域中显示你输入的消息。
out.println(text)//打印出。
out.flush()//清空
}
}
Server端
import java.net.*
import java.io.*
import java.util.*//引入包
public class ChatServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(9000)//建立服务端,端口号为9000
List list = new ArrayList()//创建个List集合。
while (true) {
Socket s = ss.accept()//等待客户端的请求。
list.add(s)//把每一个client都add到集合中去。
Thread t = new ServerThread(s, list)//线程。
t.start()//启动。
}
}
}
class ServerThread extends Thread {
Socket s
List list
BufferedReader in
PrintWriter out
public ServerThread(Socket s, List list) { //构造。传入socket和list。
this.s = s
this.list = list
try {
in = new BufferedReader(new InputStreamReader(s.getInputStream()))//输入流
out = new PrintWriter(s.getOutputStream())//输出流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
}
public void run() { //必须实现其run()方法。
while (true) {
try {
String str = in.readLine()//得到client端的message。
if (str == null) //如果没有消息就返回。
return
Iterator it = list.iterator()//遍历list。
while (it.hasNext()) { //如果list有下一个
Socket socket = (Socket) (it.next())//因为list中都是存的socket
PrintWriter o = new PrintWriter(socket.getOutputStream())//输出流
o.println(str)//输出
o.flush()//清空
}
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace()
return
}
}
}
}