关于用java多线程做的一个多人聊天小程序的一个问题——如何实现进程间的通信?

关于用java多线程做的一个多人聊天小程序的一个问题——如何实现进程间的通信?,第1张

传统的进程间通信的方式有大致如春没下几种肆森戚:

(1) 管道(PIPE)

(2) 命名管道(FIFO)

(3) 信号量(Semphore)

(4) 消息队列(MessageQueue)

(5) 共享内存(SharedMemory)

(6) Socket

Java如何支持进程间通信。我们把Java进程理解为JVM进程。很明显,传统的这些大部分技术是无法被我们的应用程序利用裂陵了(这些进程间通信都是靠系统调用来实现的)。但是Java也有很多方法可以进行进程间通信的。

除了上面提到的Socket之外,当然首选的IPC可以使用Rmi,或者Corba也可以。另外Java nio的MappedByteBuffer也可以通过内存映射文件来实现进程间通信(共享内存)。

Java 实现聊天室可以分为以下几个步骤:

建立服务器端

首先需要建立一个服务器端,负责接收客户端的连接请求并处理客户端发送过来的消息。

建立客户端

然后需要建立册陆客户端,客户端通过正姿毕网络连接到服务器端,并向服务器端发送消息。

实现通信协议

为了实现聊天室功能,需要定义一个通信协议,规定客户端和服务器端之间的通信格式,例如消息的头部和内容等。

实现多线程处理

聊天室通常会有多个用户同时在线,因此需要使用多线程举芹来处理多个客户端的连接请求和消息传递。

实现GUI界面(可选)

为了方便用户使用,可以实现一个GUI界面,让用户可以方便地发送和接收消息。

以下是一个简单的 Java 聊天室的代码示例:

java

Copy code

// 服务器端代码

public class Server {

public static void main(String[] args) {

try {

ServerSocket serverSocket = new ServerSocket(8888)

while (true) {

Socket socket = serverSocket.accept()

new Thread(new ServerThread(socket)).start()

}

} catch (IOException e) {

e.printStackTrace()

}

}

}

class ServerThread implements Runnable {

private Socket socket

private BufferedReader reader

private PrintWriter writer

public ServerThread(Socket socket) {

this.socket = socket

try {

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))

writer = new PrintWriter(socket.getOutputStream())

} catch (IOException e) {

e.printStackTrace()

}

}

public void run() {

try {

String msg

while ((msg = reader.readLine()) != null) {

// 处理客户端发送过来的消息

System.out.println("接收到消息:" + msg)

// 将消息发送给所有客户端

for (Socket s : ServerThreadList.getList()) {

if (s != socket) {

PrintWriter w = new PrintWriter(s.getOutputStream())

w.println(msg)

w.flush()

}

}

}

// 关闭连接

socket.close()

ServerThreadList.removeThread(this)

} catch (IOException e) {

e.printStackTrace()

}

}

}

class ServerThreadList {

private static List

list = new ArrayList<>()

public static void addThread(ServerThread thread) {

list.add(thread)

}

public static void removeThread(ServerThread thread) {

list.remove(thread)

}

public static List

getList() {

return list

}

}

// 客户端代码

public class Client {

public static void main(String[] args) {

try {

Socket socket = new Socket("localhost", 8888)

new Thread(new ClientThread(socket)).start()

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))

PrintWriter writer = new PrintWriter(socket.getOutputStream())

while (true) {

String msg = reader.readLine()

writer.println(msg)

writer.flush()

}

} catch (IOException e) {

e.printStackTrace()

}

}

}

class ClientThread implements Runnable {

private Socket socket

private BufferedReader reader

public ClientThread(Socket socket) {

this.socket = socket

try {

reader

这个是我们练习是做的,下面的分肢弊别为两个客户亏郑端,销饥颂写的有点固定,你可以自行的在修改一下

1.

package com.yl.testqq

import java.awt.Color

import java.awt.EventQueue

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.awt.event.KeyAdapter

import java.awt.event.KeyEvent

import java.io.BufferedReader

import java.io.IOException

import java.io.InputStreamReader

import java.io.PrintStream

import java.net.ServerSocket

import java.net.Socket

import java.net.UnknownHostException

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JTextArea

import javax.swing.border.BevelBorder

public class Zjh extends JFrame implements Runnable {

private final JTextArea txtRes

private final JTextArea txtSend

private Socket client

private static final String IP = "localhost"

private PrintStream ps

public static final int PORT = 6666

private ServerSocket server

private BufferedReader br

/**

* Launch the application

* @param args

*/

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

Zjh frame = new Zjh()

frame.setVisible(true)

} catch (Exception e) {

e.printStackTrace()

}

}

})

}

/**

* Create the frame

*/

public Zjh() {

super()

setBackground(new Color(0, 0, 0))

setTitle("Cxr to Zjh")

getContentPane().setBackground(new Color(0, 0, 0))

getContentPane().setLayout(null)

setBounds(100, 100, 300, 350)

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

txtRes = new JTextArea()

txtRes.setBorder(new BevelBorder(BevelBorder.LOWERED))

txtRes.setLineWrap(true)

txtRes.setBackground(new Color(255, 255, 255))

txtRes.setEditable(false)

txtRes.setBounds(10, 10, 270, 150)

getContentPane().add(txtRes)

txtSend = new JTextArea()

txtSend.setBorder(new BevelBorder(BevelBorder.LOWERED))

txtSend.addKeyListener(new KeyAdapter() {

public void keyPressed(final KeyEvent ke) {

if(ke.getKeyCode()==KeyEvent.VK_ENTER &&ke.isControlDown()){

sendMess()

}

}

})

txtSend.setLineWrap(true)

txtSend.setBackground(new Color(255, 255, 255))

txtSend.setBounds(10, 166, 270, 115)

getContentPane().add(txtSend)

final JButton btnSend = new JButton()

btnSend.addActionListener(new ActionListener() {

public void actionPerformed(final ActionEvent arg0) {

sendMess()

}

})

btnSend.setText("发送...")

btnSend.setBounds(184, 287, 84, 28)

getContentPane().add(btnSend)

//

new Thread(this).start()

}

private void sendMess(){

try {

client = new Socket(Zjh.IP,Cxr.PORT)

ps = new PrintStream(client.getOutputStream())

ps.println(txtSend.getText())

txtSend.setText("")

} catch (UnknownHostException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

}

public void run() {

try {

server = new ServerSocket(Zjh.PORT)

while(true){

client = server.accept()

br = new BufferedReader(new InputStreamReader(client.getInputStream()))

txtRes.insert("Cxr say:"+br.readLine()+"\r\n", 0)

}

} catch (IOException e) {

e.printStackTrace()

}

}

}

2.

package com.yl.testqq

import java.awt.Color

import java.awt.EventQueue

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.awt.event.KeyAdapter

import java.awt.event.KeyEvent

import java.io.BufferedReader

import java.io.IOException

import java.io.InputStreamReader

import java.io.PrintStream

import java.net.ServerSocket

import java.net.Socket

import java.net.UnknownHostException

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JScrollPane

import javax.swing.JTextArea

import javax.swing.border.BevelBorder

public class Cxr extends JFrame implements Runnable {

private final JTextArea txtRes

private final JTextArea txtSend

public static final int PORT = 5555

private ServerSocket server

private BufferedReader br

private static final String IP = "localhost"

private PrintStream ps

private Socket client

// private Socket client

/**

* Launch the application

* @param args

*/

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

Cxr frame = new Cxr()

frame.setVisible(true)

} catch (Exception e) {

e.printStackTrace()

}

}

})

}

/**

* Create the frame

*/

public Cxr() {

super()

setTitle("Zjh to Cxr")

getContentPane().setBackground(new Color(176, 224, 230))

getContentPane().setLayout(null)

setBounds(100, 100, 300, 350)

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

txtRes = new JTextArea()

txtRes.setBorder(new BevelBorder(BevelBorder.LOWERED))

txtRes.setLineWrap(true)

txtRes.setBackground(new Color(255, 245, 238))

txtRes.setEditable(false)

txtRes.setBounds(10, 10, 270, 150)

getContentPane().add(txtRes)

txtSend = new JTextArea()

txtSend.setBorder(new BevelBorder(BevelBorder.LOWERED))

txtSend.addKeyListener(new KeyAdapter() {

public void keyPressed(final KeyEvent ke) {

if(ke.getKeyCode()==KeyEvent.VK_ENTER &&ke.isControlDown()){

sendMess()

}

}

})

txtSend.setLineWrap(true)

txtSend.setBackground(new Color(255, 245, 238))

txtSend.setBounds(10, 166, 270, 115)

getContentPane().add(txtSend)

final JButton btnSend = new JButton()

btnSend.addActionListener(new ActionListener() {

public void actionPerformed(final ActionEvent arg0) {

sendMess()

}

})

btnSend.setText("发送...")

btnSend.setBounds(205, 287, 75, 28)

getContentPane().add(btnSend)

// final JButton button = new JButton()

// button.addActionListener(new ActionListener() {

// public void actionPerformed(final ActionEvent arg0) {

//txtSend.setForeground(Color.RED)

//txtRes.setForeground(Color.RED)

// }

// })

// button.setText("红字体")

// button.setBounds(20, 287, 106, 28)

// getContentPane().add(button)

//

new Thread(this).start()

}

private void sendMess(){

try {

client = new Socket(Cxr.IP,Zjh.PORT)

ps = new PrintStream(client.getOutputStream())

ps.println(txtSend.getText())

txtSend.setText("")

} catch (UnknownHostException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

}

public void run() {

try {

server = new ServerSocket(Cxr.PORT)

while (true){

client = server.accept()

br = new BufferedReader(new InputStreamReader(client.getInputStream()))

txtRes.insert("Zjh say:"+br.readLine()+"\r\n", txtRes.getRows())

}

} catch (IOException e) {

e.printStackTrace()

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12556316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存