(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()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)