首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

Socket的一个有关问题

2013-06-25 
Socket的一个问题写一个简单的例子测试,Socket服务器端,与客户端收发数据的功能,但出现Bug了,求助:服务器

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在最后,没有这种用法,你可以测试一下,阻塞在服务器端

热点排行