在Eclipse中,我收到此错误:
run:
[java] Error creating the server socket.
[java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
[java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
[java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它现在出现了,但几个小时前它运行良好.我需要重启机器吗?我如何深究它?我感谢任何提示或建议.
如果Socket
代表客户端并ServerSocket
代表服务器端,为什么Socket.read
要从服务器端读取数据?我真的很困惑,你能澄清一下吗?
据我所知,我可以使用TCPListener和Socket创建一个服务器,那么它们之间的区别是什么?
插座
private Socket MainSock;
MainSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MainSock.Bind(new IPEndPoint(IPAddress.Any, port));
MainSock.Listen(500);
MainSock.BeginAccept(AcceptConnections, new Wrapper());
Run Code Online (Sandbox Code Playgroud)
的TCPListener
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(localAddr, port);
server.Start();
Run Code Online (Sandbox Code Playgroud)
我真的很困惑.他们俩听取了联系,那么它们之间的区别是什么?
更新的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.IO;
public class Wrapper
{
public byte[] buffer;
public SslStream sslStream;
public object connector;
}
public class Sock
{
private Dictionary<string, byte> Connections; …
Run Code Online (Sandbox Code Playgroud) 我需要创建一个相对简单的Java tcp/ip服务器,我在确定是否应该使用像Netty这样的东西或只是坚持使用简单的ServerSocket和InputStream/OutputStream时遇到一些麻烦.
我们真的只需要监听请求,然后将新客户端Socket传递给新线程中的某些处理代码.一旦处理完成并发送响应,该线程将终止.
我喜欢Netty中管道,解码器等的想法,但对于这样一个简单的场景,似乎不值得增加前期开发时间.对我们的初始要求来说似乎有点矫枉过正,但我有点紧张,有很多事我不考虑.如果有的话,Netty对这些简单要求有什么好处?我没有考虑什么?
我在我的一个项目中使用Java.net.我写了一个从客户端获取inputStream的App Server.但有时我的(缓冲)InputStream无法获取客户端发送到我的服务器的所有OutputStream.我怎么能写一个等待或类似的东西,我的InputStream获取客户端的所有OutputStream?
(我的InputStream不是字符串)
private Socket clientSocket;
private ServerSocket server;
private BufferedOutputStream outputS;
private BufferedInputStream inputS;
private InputStream inBS;
private OutputStream outBS;
server = new ServerSocket(30501, 100);
clientSocket = server.accept();
public void getStreamFromClient() {
try {
outBS = clientSocket.getOutputStream();
outputS = new BufferedOutputStream( outBS);
outputS.flush();
inBS = clientSocket.getInputStream();
inputS = new BufferedInputStream( inBS );
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
java network-programming inputstream serversocket bufferedinputstream
我ServerSocket
在我的应用程序中使用a时遇到问题.
我正在ServerSocket
我的应用程序的构造函数中创建它.套接字的构造函数调用该accept()
方法以等待客户端连接.
问题是该accept()
方法冻结了我的整个应用程序,直到客户端连接.所以我想问一下是否有另一种方法可以ServerSocket
在一个单独的线程中创建整体,在我的主应用程序旁边调用ServerSocket
它的构造函数和它的accept()
方法?
编辑:
感谢Olivier的建议,将.accept放入runnable并创建一个线程池来处理客户端连接.
那是我现在的代码:
public void start(){
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
serverSocket = new ServerSocket(port);
while (true) {
Socket clientSocket = serverSocket.accept();
objectout = new ObjectOutputStream(clientSocket.getOutputStream());
clientProcessingPool.submit(new ClientTask(clientSocket,objectout));
}
} catch (IOException e) {
System.err.println("Accept failed.");
}
}
};
Run Code Online (Sandbox Code Playgroud)
万事都好!谢谢!
我试图连接到由PHP创建的安全websocket,但由于某种原因它不起作用.证书文件对于PHP是可读的.
到目前为止,这是我的代码(PHP方面;为简单起见,剥离代码):
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'allow_self_signed', false);
stream_context_set_option($context, 'ssl', 'verify_peer', true);
stream_context_set_option($context, 'ssl', 'peer_name', 'example.com');
stream_context_set_option($context, 'ssl', 'CN_match', 'example.com');
stream_context_set_option($context, 'ssl', 'SNI_enabled', true);
stream_context_set_option($context, 'ssl', 'local_cert', '/path/to/ssl/cert/example.com');
stream_context_set_option($context, 'ssl', 'local_pk', '/path/to/ssl/private/example.com');
$serverSocket = stream_socket_server(
'tls://example.com:8090',
$errNo,
$errStr,
\STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN,
$context
);
$client = stream_socket_accept($serverSocket);
// send initial websocket connection stuff
$request = socket_read($client, 5000);
preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches);
$key = base64_encode(pack(
'H*',
sha1($matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
));
$headers = "HTTP/1.1 101 Switching Protocols\r\n";
$headers .= "Upgrade: websocket\r\n";
$headers …
Run Code Online (Sandbox Code Playgroud) java.net.SocketException: Invalid argument: connect
当我运行以下基本代码时,我的新笔记本电脑(Alienware m17x)会抛出一个:
Server.java:
public static void main (String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket (8888);
Socket socket = serverSocket.accept();
}
Run Code Online (Sandbox Code Playgroud)
Client.java:
public static void main (String[] args) throws Exception {
Socket socket = new Socket ("localhost", 8888);
}
Run Code Online (Sandbox Code Playgroud)
每次我运行Client.java(在启动Server.java之后),我都会收到此套接字异常.以下是异常的完整描述:
Exception in thread "main" java.net.SocketException: Invalid argument: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown …
Run Code Online (Sandbox Code Playgroud) 我基本上试图在Android设备上托管服务器.客户端设备通过TCP连接到服务器并发送请求.服务器执行客户端请求的操作,然后将数据写回套接字.连接未被服务器终止,并且将通过套接字连续读取请求并回复.
注意:每个请求消息的前4个字节包含实际消息/请求的长度.
parseXmlInputAndExecuteCmd函数根据输入XML字符串的内容执行各种异步操作.这最终导致'allowResponse'变量的布尔值更改为true,并生成某个响应,该响应存储在名为'response'的String类型的变量中.一旦布尔值'allowResponse'变为true,线程就会恢复执行并将响应写回套接字的OutputStream
其中一些异步操作包括连接和断开与公司VPN的连接.这可能是错误的原因吗?
使用的一些类级变量是:
private volatile boolean allowResponse = false;
private String response;
Run Code Online (Sandbox Code Playgroud)
服务器代码:
private void startServer() {
try {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket connectionSocket = serverSocket.accept();
BufferedInputStream bufInpStream = new BufferedInputStream(connectionSocket.getInputStream());
BufferedOutputStream bufOutStream = new BufferedOutputStream(connectionSocket.getOutputStream());
ByteArrayOutputStream contentLengthBaos = new ByteArrayOutputStream();
int c;
int count = 0;
while ((c = bufInpStream.read()) != -1) {
contentLengthBaos.write(c);
count++;
if (count == 4) {
int contLen = getMessageLength(contentLengthBaos);
String content = getMessageContent(bufInpStream, contLen);
parseXmlInputAndExecuteCmd(content);
count = …
Run Code Online (Sandbox Code Playgroud) 假设Java有两种套接字:
想象一下两个过程的情况:
X =客户
Y =服务器
服务器进程Y:有一个"ServerSocket",即正在侦听TCP端口
客户端进程X:通过"Socket"向Y发送连接请求.
Y:然后该accept()
方法返回一个新的客户端类型"Socket",
当它发生时,两个套接字得到"互连",
所以:客户端进程中的套接字,与服务器进程中的套接字相连.
然后:通过套接字X读/写就像通过套接字Y读/写.
现在,两个客户端套接字互连!!
但是......
如果我在同一个进程中创建两个Client套接字,我想让它们"互连"怎么办?
......甚至可能?
假设如何在不使用中间ServerSocket的情况下使两个客户端套接字互连?
我已经通过创建两个Thread来连续读取A和写B来解决它,而另一个用于读取B和写入A ......
但我认为这可能是更好的方式......(那些世界耗能的线程不是必需的使用客户端 - 服务器方法)
任何帮助或建议将不胜感激!谢谢
编辑:
应用示例:"现有服务器应用程序可以转换为客户端应用程序",例如VNC服务器,一个客户端套接字连接到VNC服务器,并创建其他客户端套接字(连接到中间服务器),然后应用程序互连两个客户端导致VNC服务器是客户端应用程序!然后,不需要公共IP.
VNCServer --- MyApp ---> |中间服务器| <---用户
serversocket ×10
java ×8
sockets ×5
client ×2
inputstream ×2
tcp ×2
android ×1
eclipse ×1
netty ×1
networking ×1
php ×1
phpwebsocket ×1
ssl ×1
tcplistener ×1
websocket ×1