0)功能简介:
利用 socket 模拟qq 的消息发送和接收功能。既可以接收消息,也可以发送消息,无论是server 还是 client。在server 和 client 端都开启了两个线程, 一个线程用于接收并打印消息,一个线程用于发送消息。
1)问题简介:
先启动 server ,后启动client 去连接server, client 端抛出异常,说, socket 获取outputStream失败。。找不到原因啊。。oh。 求高手解答。
2)client代码如下:
package com.corejava.chapter3;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class AnalogQQClient
{
public static void main(String[] args) throws IOException
{
try(Socket socket = new Socket("127.0.0.1", 8189))
{
new Thread(new Runnable() // print server's info
{
@Override
public void run()
{
try
{
Scanner scanner = new Scanner(socket.getInputStream());
while(true)
{
if(scanner.hasNext())
{
String line = scanner.nextLine();
System.out.println("from client: " + line);
if(line.equals("bye"))
{
break;
}
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() // send info typed to the server
{
@Override
public void run()
{
try
{
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
while(true)
{
Scanner scanner = new Scanner(System.in);
if(scanner.hasNext())
{
writer.println("from server: " + scanner.nextLine());
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
}
finally
{
System.out.println("the client is closed !");
}
}
}
3)server 代码如下:
package com.corejava.chapter3;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class AnalogQQServer
{
public static void main(String[] args) throws IOException
{
try(ServerSocket serverSocket = new ServerSocket(8189))
{
Socket socket = serverSocket.accept();
new Thread(new Runnable() // print client's info
{
@Override
public void run()
{
try
{
Scanner scanner = new Scanner(socket.getInputStream());
while(true)
{
if(scanner.hasNext())
{
String line = scanner.nextLine();
System.out.println("from client: " + line);
if(line.equals("bye"))
{
break;
}
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() // send info typed to the client
{
@Override
public void run()
{
try
{
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
while(true)
{
Scanner scanner = new Scanner(System.in);
if(scanner.hasNext())
{
writer.println("from server: " + scanner.nextLine());
}
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}).start();
}
finally
{
System.out.println("the server is closed !");
}
}
}