代码适用socket通讯 1.客户端请求2.服务器端解析请求3.服务器端反馈信息4.客户端接收信息5.客户端重复请求
客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import com.transemic.acad.savaitem.SaveDrawingDialog;
public class SocketClient {
public static void main(String[] args) {
//客户端
//1、创建客户端Socket,指定服务器地址和端口
Socket socket;
try {
socket = new Socket("localhost",1024);
//2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw =new PrintWriter(os);//将输出流包装成打印流
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownOutput();
//3、获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!=null){
SaveDrawingDialog dialog = new SaveDrawingDialog();
dialog.setTitle("显示服务器返回内容");
dialog.setLabelContent(info);
dialog.setModal(true);
dialog.setVisible(true);
}
//4、关闭资源
System.out.println("---关闭链接--");
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import com.transemic.acad.savaitem.SaveDrawingDialog;
public class ServerSocketThread extends Thread {
//服务器线程处理
//和本线程相关的socket
Socket socket = null;
//
public ServerSocketThread(Socket socket){
this.socket = socket;
}
public void run(){
//服务器处理代码
//3、获取输入流,并读取客户端信息
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info=br.readLine())!=null){
// System.out.println("我是服务器,客户端说:"+info);
SaveDrawingDialog dialog = new SaveDrawingDialog();
dialog.setTitle("显示客户端请求内容");
dialog.setLabelContent(info);
dialog.setModal(true);
dialog.setVisible(true);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("XXXXXX欢迎您!");
pw.flush();
//5、关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
//============================================
//服务器代码
try {
ServerSocket serverSocket = new ServerSocket(1024);
Socket socket =null;
int count =0;//记录客户端的数量
while(true){
socket = serverSocket.accept();
ServerSocketThread serverThread = new ServerSocketThread(socket);
serverThread.start();
count++;
System.out.println("客户端连接的数量:"+count);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
显示对话框
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class SaveDrawingDialog extends JDialog implements ActionListener{
JLabel content;
private String responseResult;
public SaveDrawingDialog(){
initPanel();
}
public String getResponseResult() {
return responseResult;
}
public void setResponseResult(String responseResult) {
this.responseResult = responseResult;
}
public void initPanel(){
setTitle("保持图纸");
setSize(300, 200);
setAlwaysOnTop(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
content = new JLabel();
add(content, BorderLayout.CENTER);
{
JPanel buttonPane = new JPanel();
add(buttonPane, BorderLayout.SOUTH);
buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
{
JButton okButton = new JButton("\u786E\u5B9A");
okButton.addActionListener(this);
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
}
{
JButton cancelButton = new JButton("\u53D6\u6D88");
cancelButton.setActionCommand("Cancel");
cancelButton.addActionListener(this);
buttonPane.add(cancelButton);
}
}
}
public void setLabelContent(String conent){
content.setText(conent);
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("OK")){
setVisible(false);
}
if(command.equals("Cancel")){
setVisible(false);
}
}
}
分享到:
相关推荐
- 为了同时处理多个客户端连接,服务器端通常使用多线程。每当有新的连接请求,就在新线程中处理。 - 这样可以提高服务器的并发性能,但也会增加编程的复杂性。 7. **实例工程结构** - "JavaSocketworkspace...
Java编程Socket实现多个客户端连接同一个服务端代码 Java编程Socket实现多个客户端连接同一个服务端代码是Java编程中的一种常见应用场景。该代码主要介绍了如何使用Java Socket实现多个客户端连接同一个服务端,...
- 接受客户端连接请求后,为每个客户端创建独立线程处理数据传输。 #### 六、注意事项 1. **异常处理**:代码中通过try-catch块对可能出现的异常进行了捕获处理。 2. **资源释放**:虽然示例中没有明确展示资源的...
本示例“java socket多客户端之间通信”着重于如何利用Socket实现多个客户端通过服务器进行相互之间的消息传递,包括群发和定向发送。下面我们将深入探讨相关知识点。 1. **Socket基本概念**: Socket在Java中被...
如果服务器需要同时处理多个客户端的连接,可以考虑使用多线程或者Java的`ExecutorService`来为每个新连接创建一个新的处理线程,以避免阻塞其他客户端的连接请求。 以上就是Java Socket编程中服务器和客户端交互...
- 当有客户端连接时,创建一个新的 Socket 对象,为每个连接创建单独的线程处理,避免阻塞其他客户端的连接。 - 通过输入输出流解析接收到的 CMPP 消息,执行相应操作,如发送回执、存储消息等。 4. **客户端实现...
在实际应用中,可能还需要考虑多线程处理多个客户端请求、错误处理、数据编码解码等问题。同时,由于UDP的不可靠性,可能会丢失或重复数据,因此在设计协议时需要考虑到这些特性,并采取相应的补偿措施。 总的来说...
多客户端通讯的核心在于服务器端需要能够同时处理多个客户端的连接请求。这可以通过多线程来实现。在服务器端,为每个新连接的客户端创建一个单独的线程,每个线程负责处理与一个客户端的通信。这样,服务器可以并发...
在实际开发中,为了提高程序的健壮性和可维护性,我们还会考虑异常处理、多线程(让服务端能够同时处理多个客户端连接)、资源管理(确保及时关闭Socket和流)等因素。此外,还可能引入nio(非阻塞I/O)或netty等高...
每个新连接的客户端都会启动一个新的线程,这样服务器就可以同时处理多个请求。 6. **异常处理**: - 文件传输过程中可能出现各种异常,如网络中断、文件不存在等,因此必须进行适当的异常处理,以确保程序的健壮...
通常,服务器需要同时处理多个客户端的连接请求,因此在服务器端的实现中,我们可能会用到多线程技术。每个客户端连接都会在一个单独的线程中处理,以避免阻塞其他连接。 5. **I/O流**: Java中的InputStream和...
2. 当有新的客户端连接时,服务器会创建一个新的Socket对象来处理这个连接,形成一个新的线程,这样服务器就能同时处理多个客户端的连接。 3. 接收到客户端发送的消息后,服务器需要将这些消息广播到所有已连接的...
- 如果服务器需要同时处理多个客户端连接,通常会在每次`ServerSocket.accept()`返回新`Socket`时启动一个新的线程。这样,每个客户端连接都可以独立于其他连接进行处理。 7. **生命周期管理**: - 服务器端需要...
每个客户端连接对应一个独立的线程,以便服务器可以同时处理多个客户端的请求。 7. **输入/输出流**:Socket 提供了 InputStream 和 OutputStream 接口,用于在客户端和服务端之间传输数据。客户端使用 ...
- **多线程处理**:为了同时处理多个客户端的连接,通常会在每次接受到新连接时启动一个新的线程来处理通信,这样可以确保服务器不会因为处理一个连接而阻塞其他连接。 2. **客户端开发**: - **Socket类**:...
当服务器端使用多线程处理Socket连接时,每当有新的客户端连接,服务器就会创建一个新的线程来处理这个连接,从而实现同时处理多个客户端请求。这样避免了单线程模型中因等待某个客户端操作而导致其他客户端无法被...
Java中的Socket类是进行网络通信的核心组件,它主要用于实现客户端与服务器之间的TCP连接,从而进行双向数据传输。本文将深入探讨如何使用Socket类接收和发送数据。 首先,我们需要理解Socket类的基本概念。Socket...
2. **处理多个代理的情况**:"X-Forwarded-For"可能包含多个IP,因为请求可能经过多个代理。格式通常是"client IP, proxy 1 IP, proxy 2 IP",所以我们需要处理这个字符串,获取第一个IP作为真实客户端IP。 ```java...
在接收到新的连接请求时,服务器会创建一个新的Socket实例来处理该连接,这样可以确保同时处理多个客户端的请求。描述中提到已经实现了线程方式接收多个客户端连接,这可能意味着每个客户端连接都会启动一个新的线程...
此外,多线程技术常常用于提升服务器处理并发连接的能力,每个客户端连接都会在新的线程中处理,这样服务器可以同时服务于多个客户端。 总结一下,本示例中的Java TCP Socket编程展示了如何使用Java的Socket类创建...