Socket的一个问题
写一个简单的例子测试,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
[解决办法]
服务器端:
package com.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;
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在最后,没有这种用法,你可以测试一下,阻塞在服务器端