我有一个简单的socket
/serversocket
示例,我正在试图运行,但客户端和服务器在BufferedReader
试图读取时挂起。下面是每个代码:Java客户端/服务器不通过Socket/ServerSocket进行通信
服务器
package picturePerfect;
--imports--
public class PictureServer implements Runnable{
static ServerSocket serverSocket;
public static void main(String[] args) throws IOException {
serverSocket = new ServerSocket(2342);
Thread firstSessionThread = new Thread(new PictureServer());
firstSessionThread.start();
}
@Override
public void run() {
Socket socket = null;
try {
socket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientRequest = bufferedReader.readLine();
System.out.println(clientRequest);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("Sent from server!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
CLIENT
package picturePerfect;
--imports--
public class PictureClient {
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
Socket socket = new Socket("localhost", 2342);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.write("Sent from client!");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = bufferedReader.readLine();
System.out.println(response);
socket.close();
}
}
这是我能简化我的代码,以最起码的。我有一个示例程序,我一直遵循,这似乎几乎完全相同。这是样板服务器和客户端(即做工作):
示例服务器
--imports--
public class Server implements Runnable{
static ServerSocket ss;
public static void main(String[] args) throws IOException {
ss = new ServerSocket(3142);
Thread thread = new Thread(new Server());
thread.start();
}
@Override
public void run() {
while (true) {
Socket s = null;
try {
s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String operands = br.readLine();
System.out.println(operands + " was received");
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(operands + " right back!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
样本客户
--imports--
public class Server implements Runnable{
static ServerSocket ss;
public static void main(String[] args) throws IOException {
ss = new ServerSocket(3142);
Thread thread = new Thread(new Server());
thread.start();
}
@Override
public void run() {
while (true) {
Socket s = null;
try {
s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String operands = br.readLine();
System.out.println(operands + " was received");
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(operands + " right back!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我试图把while循环进入我的服务器和我的客户端和服务器移动到默认包,但都没有帮助。我也尝试使用read()
而不是readLine()
,并以\r\n
结束printWriter的行,但在那里没有成功。
为什么我的代码挂在readLine()
上,特别是当示例代码不是?
如果您使用的是Windows,请查看http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx中的TCPView,以监视由端口/进程发送/接收的数据包。几个星期前,我在Java中创建服务器/客户端应用程序时使用了它,并且可以很方便地查看它是显示错误还是网络错误。 – Matthew
哦,这很酷!我并没有在这里需要它,但它对我下一个项目会很有用。谢谢! –