我应该基于Java Swing和gui制作一个服务器和客户端。我希望以某种方式创建一个套接字,该套接字将从服务器到客户端,再从客户端到服务器,并传递某种字符串。后来想拥有一个函数,该函数根据套接字中的字符串执行几项操作。
由于某种原因,我找不到一个简单的代码示例来说明如何以简单的方式完成代码。
任何人都有任何简单的示例,或者可以解释如何完成?
基于此示例,这是一个使用Swing的简单网络客户端/服务器对。请注意与正确同步有关的一些问题:GUI本身是使用事件分配线程构建的invokeLater()
。此外,代码还依赖的线程安全性append()
。最后,它结合了文章Text Area Scrolling中的一个方便提示。
更新:在Java 7中,append()
不再标记为线程安全;invokeLater()
用于display()
序列更新。
package net;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.text.DefaultCaret;
/**
* A simple network client-server pair
* @http://stackoverflow.com/questions/3245805
*/
public class Echo implements ActionListener, Runnable {
private static final String HOST = "127.0.0.1";
private static final int PORT = 12345;
private final JFrame f = new JFrame();
private final JTextField tf = new JTextField(25);
private final JTextArea ta = new JTextArea(15, 25);
private final JButton send = new JButton("Send");
private volatile PrintWriter out;
private Scanner in;
private Thread thread;
private Kind kind;
public static enum Kind {
Client(100, "Trying"), Server(500, "Awaiting");
private int offset;
private String activity;
private Kind(int offset, String activity) {
this.offset = offset;
this.activity = activity;
}
}
public Echo(Kind kind) {
this.kind = kind;
f.setTitle("Echo " + kind);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getRootPane().setDefaultButton(send);
f.add(tf, BorderLayout.NORTH);
f.add(new JScrollPane(ta), BorderLayout.CENTER);
f.add(send, BorderLayout.SOUTH);
f.setLocation(kind.offset, 300);
f.pack();
send.addActionListener(this);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
DefaultCaret caret = (DefaultCaret) ta.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
display(kind.activity + HOST + " on port " + PORT);
thread = new Thread(this, kind.toString());
}
public void start() {
f.setVisible(true);
thread.start();
}
//@Override
public void actionPerformed(ActionEvent ae) {
String s = tf.getText();
if (out != null) {
out.println(s);
}
display(s);
tf.setText("");
}
//@Override
public void run() {
try {
Socket socket;
if (kind == Kind.Client) {
socket = new Socket(HOST, PORT);
} else {
ServerSocket ss = new ServerSocket(PORT);
socket = ss.accept();
}
in = new Scanner(socket.getInputStream());
out = new PrintWriter(socket.getOutputStream(), true);
display("Connected");
while (true) {
display(in.nextLine());
}
} catch (Exception e) {
display(e.getMessage());
e.printStackTrace(System.err);
}
}
private void display(final String s) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
ta.append(s + "\u23CE\n");
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
new Echo(Kind.Server).start();
new Echo(Kind.Client).start();
}
});
}
}
套接字接口 结构体 struct fd_set 文件句柄管理 更多... 类型定义 typedef struct fd_set fd_set 文件句柄管理 函数 int socket (int domain, int type, int protocol) 创建套接字 int bind (int s, const struct sockaddr *name, so
问题内容: 假设我有一个Java程序,该程序使用HTTP 1.1在服务器上发出HTTP请求,并且不关闭连接。我提出一个请求,并读取从绑定到套接字的输入流返回的所有数据。但是,在发出第二个请求时,服务器没有响应(或者流有问题- 它不再提供任何输入)。如果我按顺序发出请求(请求,请求,读取),则可以正常工作,但(请求,读取,请求,读取)则不能。 有人能解释为什么会发生这种情况吗?(代码片段如下)。无论
问题内容: 我在Linux上使用 --skip-networking 选项使用MySQL 。 尝试使用JDBC将基于J2EE的应用程序(使用servlet)连接到MySQL数据库。 使用 禁用* 了 --skip-networking 选项的MySQL时,我以以下方式连接到数据库: * 启用 --skip-networking 选项后,我尝试将其连接为: 但这似乎不起作用,当我尝试连接到应用程序中
问题内容: 我有一个Java应用程序,它创建一个套接字来与服务器进程进行通信,例如,新的java.net.Socket(String host,int port)。该应用程序包括一堆旧的c ++代码,这些代码需要从该服务器中吸取大量数据并对其进行处理。当前,这是通过使本机代码创建自己的套接字并连接到服务器来实现的,例如: 在具有多个NIC(例如,有线和wifi或vpn连接)的Windows vis
问题内容: 这是代码,但出现错误: 可以从插座接收使用吗? 问题答案: 不。当您有字节数组时,要使用该数组,并且要像文件一样从数组中读取,就可以使用。如果只想从套接字读取字节数组,请执行以下操作: 该变量将包含实际读取的字节数,并且数据当然将在array中。
本文向大家介绍如何在JavaScript \ HTML中使用套接字?,包括了如何在JavaScript \ HTML中使用套接字?的使用技巧和注意事项,需要的朋友参考一下 要使用套接字,请考虑JavaScript中的WebSocket接口。该接口使Web应用程序可以维护与服务器端进程的双向通信。 为了使Web应用程序能够与服务器端进程保持双向通信,此规范引入了WebSocket接口。 以下是一些解