package socketTest;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.io.OutputStream;
import java.io.InputStream;public class socketTest extends Thread
{
private Socket s;
public socketTest(Socket s)
{
this.s = s;
}
public void run()
{
try
{
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
int data;
while('q' != (data = System.in.read()))
{
os.write(data);
} System.out.println("d");
while(-1 != (data = is.read()))
{
System.out.write(data);
}
os.close();
is.close();
s.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void server()//静态,便于在main里面调用
{
try
{
ServerSocket ss = new ServerSocket(5000);
while(true)
{
Socket s = ss.accept();
new socketTest(s).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void client()
{
try
{
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 5000);
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
int data;
while(-1 != (data = is.read()))
{
System.out.write(data);
}
System.out.println("out");//打印输出out
while('q' != (data = System.in.read()))
{
os.write(data);
}
os.close();
is.close();
s.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
if(args.length > 0)
{
server();
}
else
{
client();
}
}

}
这段代码运行之后我分别启动一个服务器和一个客户端
在服务器中输入一串字符之后以q结尾,可是在客户端,却没有运行到打印输出out那句,为什么啊?
难道不是-1吗? while语句里

解决方案 »

  1.   

    把Server端和Client分开写,你这样写的话只启动了一个,不是Server就是Client!!
      

  2.   

    server与client分开写,运行的时候先运行server然后运行client
      

  3.   

    确实不是 -1 ,客户端socket的输入流会不停的读下去.认为服务端的流永远不会结束。
    两边可以通过协商来发送消息,比如说在服务端在发送消息的末尾加上一个换行符,客户端接收到换行符之后就认为接收结束。下面是这种方法的实现代码:服务端:
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;public class ServerCase {

    private static ServerSocket server;
    private static Socket s;

    public static void main(String args[]){

    try {
    // 创建一个服务端口
    server = new ServerSocket(8000);

    // 等待用户
    s = server.accept();

    // 处理客户
    service(s);
    } catch (IOException e) {
    System.out.println("等待客户出错!");
    e.printStackTrace();
    }
    }

    // 处理用户,比如say hello to the user
    public static void service(Socket s){

    try {
    BufferedReader reader = new BufferedReader( new InputStreamReader(System.in));
    BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(s.getOutputStream()));

    String hello = reader.readLine();
    // 加上换行符,便于客户端确认一句消息
    writer.write(hello+"\r\n");
    writer.flush();

    } catch (IOException e) {
    System.out.println("error occured when say hello to user! ");
    e.printStackTrace();
    }
    }
    }
    客户端:
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;public class ClientCase {

    private static Socket s;

    public static void main(String args[]){

    try {
    // 连接服务器
    s = new Socket( "localhost" , 8000);

    // 接收服务器端的信息
    receive(s);

    } catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    } private static void receive(Socket s2) {

    try {
    InputStream in = s.getInputStream();

    StringBuffer buf = new StringBuffer();
    int n ;
    while((n= in.read()) != -1 ){
    if(n != 13 ){ // 13 为 换行符"\r"的ascii码
    buf.append( ( char) n );
    }else{
    // 打印接收到的内容,并跳出循环结束程序
    System.out.println(buf);
    break;
    }
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    此程序的用意是,从服务端接收一行字符串,发送给客户端,客户端即打印这行字符.