我有这个该死的结构:
public void run() {
try {
if (!portField.getText().equals("")) {
String p = portField.getText();
CharSequence numbers = "0123456789";
btnRun.setEnabled(false);
if (p.contains(numbers)) {
ServerSocket listener = new ServerSocket(Integer.parseInt(p));
while (true) {
Socket socket = listener.accept();
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hi there, human.");
} finally {
socket.close();
}
}} else {
JOptionPane.showMessageDialog(null, "Only numbers are allowed.");
}
}
} catch (NumberFormatException | HeadlessException | IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我需要完全像使用套接字一样关闭侦听器.问题是,如果我在循环后尝试这样做,代码将"无法访问",如果我尝试在ServerSocket的任何地方声明一个字段,我会得到一个NullPointerException.我不想与socket/client一起关闭ServerSocket,因为我想建立新的连接.
这是我的问题:
在这种情况下关闭ServerSocket真的是必要的吗?当软件关闭时,ServerSocket会自行关闭?(System.exit(0)).如果我关闭软件时继续运行ServerSocket只是因为我没有关闭它,那么我有一个问题,因为我无法达到那个血腥的代码来关闭它:).
我有一个服务器套接字程序,当我运行此程序时,我收到以下错误:
java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
at java.net.ServerSocket.bind(ServerSocket.java:328)
at java.net.ServerSocket.<init>(ServerSocket.java:194)
at Server.main(Server.java:20)
Could not listen on port: 5434.
Run Code Online (Sandbox Code Playgroud)
postgres sql server已在此端口上运行,这解释了错误.我的硬件设备只将数据发送到此5434端口.
有什么方法可以解决这个错误?
如果我有一个String代表IP地址(IPv4或IPv6)的话,我怎么能创建ServerSocket并绑定到这个IP而不关心IP是否传入,是IPv4还是IPv6?
我看到有一个构造函数:ServerSocket(int port, int backlog, InetAddress bindAddr)但InetAddress似乎没有提供任何构造函数,它的子类具有特定于IPv4和IPv6的名称.
那么如何将套接字绑定到IP呢?
我有一个java应用程序(不在任何应用程序容器中运行),它监听ServerSocket上的连接.我希望它只接受来自localhost的连接.目前,在接受连接后,它会检查对等IP并拒绝它,如果它不是环回地址,但我知道对等IP地址可能是欺骗性的.所以,如果可能的话,我宁愿绑定到只监听环回接口的套接字; 这可能吗?
我尝试了一些不同的东西(例如在调用bind()时指定"127.0.0.1"作为本地地址)没有运气.提前致谢.
感谢大家的帮助.我很尴尬地承认这完全是我的错.我们的应用程序侦听两个不同的端口,我将一个绑定到loopback接口,但是测试另一个.当我实际尝试telnet到正确的端口时,一切正常(即,绑定到"127.0.0.1"完全符合它的预期).
至于欺骗环回地址,你们是对的.我不应该把它听起来像是主要关注点.实际上,期望的行为是仅采用本地连接,并且仅绑定到本地接口是比接受所有连接然后关闭非本地连接更直接的实现方式.
我已经尝试了一段时间,我希望多个客户端同时接收多个输入.
有一个问题,如果一个客户端说'print2all Hi',我希望服务器向所有客户打印"Hi".
我知道如何处理它来打印它,只是打印到所有客户端是问题.
这是我到目前为止所拥有的.
服务器
try{
try{
server = new ServerSocket(25565);
} catch (Exception e){
e.printStackTrace();
}
while (isListening){
new SocketThread(server.accept()).start();
}
server.close();
} catch (Exception e){
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
SocketThread
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine, outputLine;
Processor kkp = new Processor();
out.println("Hi!");
while ((inputLine = in.readLine()) != null) {
outputLine = kkp.Proccess(inputLine,this.socket);
out.println(outputLine);
}
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
客户
Processor p = …Run Code Online (Sandbox Code Playgroud) 我已经搜索了很多这个例外,但是我没有找到任何可以解决我的问题的相关答案,我正在使用HttpURLConnection从网址获取xml的响应,它工作正常但有时我得到这个例外:
java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer),我使用了以下代码,url1是我的url,它给出了一个xml.
url=new URL(url1);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.connect();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String result, line = reader.readLine();
result = line;
while((line=reader.readLine())!=null)
{
result+=line;
}
System.out.println("Result: "+result);
Run Code Online (Sandbox Code Playgroud) 我尝试在Java中编写最简单的服务器应用程序,显示带有textarea输入的html表单,在提交后,我可以解析在该textarea中键入的xml.现在,我构建简单的基于服务器的服务器,如下所示:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class WebServer {
protected void start() {
ServerSocket s;
String gets = "";
System.out.println("Start on port 80");
try {
// create the main server socket
s = new ServerSocket(80);
} catch (Exception e) {
System.out.println("Error: " + e);
return;
}
System.out.println("Waiting for connection");
for (;;) {
try {
// wait for a connection
Socket remote = s.accept();
// remote is now the connected socket
System.out.println("Connection, sending data.");
BufferedReader …Run Code Online (Sandbox Code Playgroud) 我知道术语"负载平衡"可能非常广泛,但我试图解释的主题更具体,我不知道正确的术语.我正在构建的是一组服务器/客户端应用程序.服务器需要能够处理大量的数据传输以及客户端连接,因此我开始研究多线程.
基本上有3种方法可以看到为服务器实现任何类型的线程......
第三个是我想知道的.这包括这样的设置:
我目前还没有找到任何代码,但有关如何使用这样的设置的信息,以及最好是在Delphi(XE2)中完成此操作的教程.即使是一个适当的单词或名称来填充这个主题就足够了,所以我可以自己进行搜索.
编辑
我发现有必要解释一下这将用于什么.我将流式传输命令和图像,将有一个双插槽设置,其中有一个"主命令套接字"和另一个"附加图像流套接字".所以真正的一个连接是2个套接字连接.
与服务器主套接字的每个连接都创建(或重新使用)表示该连接所需的所有数据的对象,包括线程,图像,设置等.对于与主套接字的每个连接,还连接了流式套接字.它并不总是流式传输图像,但命令套接字始终准备就绪.
关键是我已经在我当前的设置中有一个线程机制(每个会话对象1个线程),我想把它转移到类似池的多线程环境.这两个连接在一起需要对这些线程进行更高级别的控制,我不能依赖像Indy这样的东西来保持这些同步,我宁愿知道事情是如何工作的,而不是学会相信其他东西来完成工作.我.
delphi multithreading load-balancing serversocket delphi-xe2
我正在尝试通过TCP将一个对象从服务器端套接字发送到客户端套接字.我无法找出问题所在.
这是我在客户端遇到的错误:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at ClientSide.main(ClientSide.java:16)
Run Code Online (Sandbox Code Playgroud)
服务器端代码:
import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class ServerSide {
public static void main(String[] args) {
try
{
ServerSocket myServerSocket = new ServerSocket(9999);
Socket skt = myServerSocket.accept();
ArrayList<String> my = new ArrayList<String>();
my.set(0,"Bernard");
my.set(1, "Grey");
try
{
ObjectOutputStream objectOutput = new ObjectOutputStream(skt.getOutputStream());
objectOutput.writeObject(my);
}
catch (IOException e)
{
e.printStackTrace();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户端代码:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket; …Run Code Online (Sandbox Code Playgroud) 我设法创建了一个C#Server,它使用发送文件到AS3(AIR)客户端sockets.在AS3方面,我正在使用该flash.net.Socket库来接收数据TCP.
这是它的工作原理:
- >我打开我的服务器,它监听客户端(我可以创建一个连接设备列表);
- >我打开我的客户端,它会自动接收数据;
接收数据的触发事件是在客户端上进行的,即我只是打开服务器,当客户端打开时,它获取数据,触发这些事件:
socket.addEventListener(Event.CONNECT, onConnect); -> to connect to the server
socket.addEventListener(Event.SOCKET_DATA, onDataArrival); -> to receive the data
Run Code Online (Sandbox Code Playgroud)
现在我想做一些不同的事情.我不想在客户端上触发它,我希望服务器这样做,即,我想打开我的客户端,并在服务器上放入客户端将获取数据.
那么为什么我要尝试让客户端成为客户端/服务器呢?好吧,因为我的服务器是一台机器,而我的客户端是连接服务器的XXX移动设备,这是我实现这一目标的方法.
所以,鉴于我刚才所说的,我设法创建了我的AS3客户端/服务器应用程序,使用该flash.net.ServerSocket库就像我想要的那样.
首先我把客户端听了:
serverSocket.bind(portNumber, "10.1.1.212");
serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnectServer);
serverSocket.listen();
Run Code Online (Sandbox Code Playgroud)
然后我使用了接收数据 flash.net.Socket Event.SOCKET_DATA
这就是它.像我想要的那样工作.
但是,它flash.net.ServerSocket与移动设备不兼容,但......
所以这是我的问题:我需要从C#服务器发送文件(需要监听客户端以便我可以创建连接设备列表)到AS3(AIR)客户端,但我必须定义哪个客户端正在获取数据服务器,客户端需要随时准备接收数据,因此,听,但有很多,这就是我认为它们作为客户端的原因.
我的问题是:有没有办法让客户端监听传入的连接并在事件发生时触发事件,而不使用AS3中的服务器套接字?
此外,如果您有不同的方法来实现我的目标,而不使用C#服务器< - > AS3客户端/服务器逻辑,请随时提出您的意见.
serversocket ×10
java ×7
sockets ×5
tcp ×2
air ×1
android ×1
delphi ×1
delphi-xe2 ×1
inetaddress ×1
ip ×1
localhost ×1
loopback ×1
post ×1
printwriter ×1
xml ×1