读书人

Socket的一个有关问题

发布时间: 2013-06-25 23:45:42 作者: rapoo

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) {
}
}
}
}

}




[解决办法]
引用:
Quote: 引用:

问题出在

for (int c; (c = inBuffer.read()) != -1;) {
System.out.print((char) c);
}

你的Server端没有读到-1,Client没有close,所有阻塞在这了

服务器端,读取到客户段的输入请求了,客户端没有读取到服务器段的输出。Client端,close了啊。

呵呵,你Close在最后,没有这种用法,你可以测试一下,阻塞在服务器端

读书人网 >J2SE开发

热点推荐