写一个简单的例子测试,Socket服务器端,与客户端收发数据的功能,但出现Bug了,求助:
服务器端:
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;/**
* Socket服务器端,a simple example
*/
public class ServerOne {
public static void main(String[] args) {
ServerSocket serverSocket = null;
while (true) {
try {
// 服务器端SeverSocket
serverSocket = new ServerSocket(8080, 0, InetAddress.getLocalHost()); // 阻塞直到有请求接入
Socket accept = serverSocket.accept(); // 得到输入流
InputStream inputStream = accept.getInputStream(); // 输出请求的字符
BufferedInputStream inBuffer = new BufferedInputStream(inputStream);
for (int c; (c = inBuffer.read()) != -1;) {
System.out.print((char) c);
} // 得到输出流
OutputStream outputStream = accept.getOutputStream();
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
BufferedWriter writer = new BufferedWriter(streamWriter);
DateFormat df = new SimpleDateFormat("yyyy-mm-dd hh:MM:ss");
String str = "当前时间是:" + df.format(System.currentTimeMillis());
// 输出日期,时间,并刷新输出缓冲区
writer.write(str);
writer.flush(); } catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException ignore) {
}
}
}
}
}
}
客户端:import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;/**
* Socket客户端
*/
public class ClientOne {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket(InetAddress.getLocalHost(), 8080); // 得到输出流
OutputStream outputStream = socket.getOutputStream(); // 输出
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bfWriter = new BufferedWriter(streamWriter);
bfWriter.write("Hello Boy!");
// 刷新缓冲区
bfWriter.flush(); // 得到输入流,并输出
InputStream inputStream = socket.getInputStream(); InputStreamReader stReader = new InputStreamReader(inputStream);
for (int c; (c = stReader.read()) != -1;) {
System.out.print((char) c);
}
System.out.println("ceshi");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException ignore) {
}
}
}
}
}ServerOne先启动,ClientOne后启动
result:
ServerOne输出 Hello Boy!
Client没输出,一直阻塞
求助? why? socket
服务器端:
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;/**
* Socket服务器端,a simple example
*/
public class ServerOne {
public static void main(String[] args) {
ServerSocket serverSocket = null;
while (true) {
try {
// 服务器端SeverSocket
serverSocket = new ServerSocket(8080, 0, InetAddress.getLocalHost()); // 阻塞直到有请求接入
Socket accept = serverSocket.accept(); // 得到输入流
InputStream inputStream = accept.getInputStream(); // 输出请求的字符
BufferedInputStream inBuffer = new BufferedInputStream(inputStream);
for (int c; (c = inBuffer.read()) != -1;) {
System.out.print((char) c);
} // 得到输出流
OutputStream outputStream = accept.getOutputStream();
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
BufferedWriter writer = new BufferedWriter(streamWriter);
DateFormat df = new SimpleDateFormat("yyyy-mm-dd hh:MM:ss");
String str = "当前时间是:" + df.format(System.currentTimeMillis());
// 输出日期,时间,并刷新输出缓冲区
writer.write(str);
writer.flush(); } catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException ignore) {
}
}
}
}
}
}
客户端:import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;/**
* Socket客户端
*/
public class ClientOne {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket(InetAddress.getLocalHost(), 8080); // 得到输出流
OutputStream outputStream = socket.getOutputStream(); // 输出
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bfWriter = new BufferedWriter(streamWriter);
bfWriter.write("Hello Boy!");
// 刷新缓冲区
bfWriter.flush(); // 得到输入流,并输出
InputStream inputStream = socket.getInputStream(); InputStreamReader stReader = new InputStreamReader(inputStream);
for (int c; (c = stReader.read()) != -1;) {
System.out.print((char) c);
}
System.out.println("ceshi");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException ignore) {
}
}
}
}
}ServerOne先启动,ClientOne后启动
result:
ServerOne输出 Hello Boy!
Client没输出,一直阻塞
求助? why? socket
System.out.print((char) c);
}你的Server端没有读到-1,Client没有close,所有阻塞在这了
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;public class ServerOne {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
// 服务器端SeverSocket
serverSocket = new ServerSocket(8080, 0, InetAddress.getLocalHost());
/**
* 首先要明白一个端口号好IP确定一个服务器端,那么你把while写在上面那句代码前面肯定不行,一定会报端口被占用的。要想连接多个客户端,while只能加在这里,
* while里面的代码要修改,要将accept返回的输入输出流保存到map中,可以用客户端的ip作为key。
*/
//while(true){
// 阻塞直到有请求接入
Socket accept = serverSocket.accept();
// 得到输入流
InputStream inputStream = accept.getInputStream();
// 得到输出流
OutputStream outputStream = accept.getOutputStream();
new Thread(new ServerMessageReader(inputStream)).start();
OutputStreamWriter streamWriter = new OutputStreamWriter(
outputStream);
BufferedWriter writer = new BufferedWriter(streamWriter);
DateFormat df = new SimpleDateFormat("yyyy-mm-dd hh:MM:ss");
String str = "当前时间是:" + df.format(System.currentTimeMillis()); // 输出日期,时间,并刷新输出缓冲区
writer.write(str);
writer.flush();
//}while结束位置
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException ignore) {
}
}
}
}}/**
* 当流通道建立成功以后将一直连接,不会中断,如果对方没有输出东西,那么接受方就会一直等待。
* @author johon
*
*/
class ServerMessageReader implements Runnable {
private InputStream inputStream;
public ServerMessageReader(InputStream inputStream) {
this.inputStream = inputStream;
} @Override
public void run() {
// 输出请求的字符
BufferedInputStream inBuffer = new BufferedInputStream(inputStream);
try {
for (int c; (c = inBuffer.read()) != -1;) {
System.out.print((char) c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:package com.socket;import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class ClientOne { /**
* @param args
*/
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket(InetAddress.getLocalHost(), 8080);
// 得到输出流
OutputStream outputStream = socket.getOutputStream();
// 输出
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bfWriter = new BufferedWriter(streamWriter);
bfWriter.write("Hello Boy!");
// 刷新缓冲区
bfWriter.flush();
// 得到输入流,并输出
InputStream inputStream = socket.getInputStream();
InputStreamReader stReader = new InputStreamReader(inputStream);
for (int c; (c = stReader.read()) != -1;) {
System.out.print((char) c);
}
System.out.println("ceshi");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException ignore) {
}
}
}
}}
呵呵,你Close在最后,没有这种用法,你可以测试一下,阻塞在服务器端
客户端要等到服端输出后才能关闭连接
服务端无法走出for,客户端收不到服务端数据一直阻塞在那里,dead lock了