一个简单的聊天程序,请指点错在哪里了???
分2个程序,服务器和客户,为了方便输入,每个程序都专门建立了一个线程进行写,而主线程负责读
编译没错,运行的效果却不对,请指点:
这个是服务器的:
程序代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class ServerTest { public static void main(String[] args) {
new ServerTest(PORT).gogo();
}
private static final int PORT = 400;
private ServerSocket server;
private Socket socket;
private PrintWriter writer;
private BufferedReader reader;
private BufferedReader in; //用户写
private Runnable writeThread;
private String humanStr;
private String clientStr;
public ServerTest(int port){
try{
server = new ServerSocket(port);
System.out.println("Server 已经建立...");
}
catch(Exception e1){
e1.printStackTrace();
}
}
public void gogo(){
try{
System.out.println("in gogo()...");
socket = server.accept();
System.out.println("Client 已经连接...");
in = new BufferedReader(new InputStreamReader(System.in));
writer = new PrintWriter(socket.getOutputStream());
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writeThread = new Runnable(){
public void run(){
try {
while((humanStr = in.readLine()) != null){
System.out.println("Server: " + humanStr);
writer.write(humanStr + "\n");
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
};
new Thread(writeThread).start();
//System.out.println("before read");
while((clientStr = reader.readLine()) != null){
System.out.println("Client: " + clientStr + "\n");
}
//System.out.println("after read");
in.close();
writer.close();
reader.close();
socket.close();
server.close();
}
catch(Exception e3){
e3.printStackTrace();
}
}
}
这个是客户端的:
程序代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;public class ClientTest { public static void main(String[] args) {
new ClientTest(PORT).gogo();
}
private static final int PORT = 400;
private Socket socket;
private InetAddress address;
private PrintWriter writer;
private BufferedReader reader;
private BufferedReader in; //用户写
private Runnable writeThread;
private String humanStr;
private String serverStr;
public ClientTest(int port){
try{
address = InetAddress.getLocalHost();
socket = new Socket(address,port);
}
catch(Exception e1){
e1.printStackTrace();
}
}
public void gogo(){
try{
in = new BufferedReader(new InputStreamReader(System.in));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
writeThread = new Runnable(){
public void run(){
try {
while((humanStr = in.readLine()) != null){
System.out.println("Client: " + humanStr + "\n");
writer.write(humanStr + "\n");
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
};
new Thread(writeThread).start();
//System.out.println("before read");
while ((serverStr = reader.readLine()) != null){
System.out.println("Server: " + serverStr + "\n");
}
//System.out.println("after read");
in.close();
reader.close();
writer.close();
socket.close();
}
catch(Exception e3){
e3.printStackTrace();
}
}
}
求指教哇!!!谢谢。
分2个程序,服务器和客户,为了方便输入,每个程序都专门建立了一个线程进行写,而主线程负责读
编译没错,运行的效果却不对,请指点:
这个是服务器的:
程序代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class ServerTest { public static void main(String[] args) {
new ServerTest(PORT).gogo();
}
private static final int PORT = 400;
private ServerSocket server;
private Socket socket;
private PrintWriter writer;
private BufferedReader reader;
private BufferedReader in; //用户写
private Runnable writeThread;
private String humanStr;
private String clientStr;
public ServerTest(int port){
try{
server = new ServerSocket(port);
System.out.println("Server 已经建立...");
}
catch(Exception e1){
e1.printStackTrace();
}
}
public void gogo(){
try{
System.out.println("in gogo()...");
socket = server.accept();
System.out.println("Client 已经连接...");
in = new BufferedReader(new InputStreamReader(System.in));
writer = new PrintWriter(socket.getOutputStream());
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writeThread = new Runnable(){
public void run(){
try {
while((humanStr = in.readLine()) != null){
System.out.println("Server: " + humanStr);
writer.write(humanStr + "\n");
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
};
new Thread(writeThread).start();
//System.out.println("before read");
while((clientStr = reader.readLine()) != null){
System.out.println("Client: " + clientStr + "\n");
}
//System.out.println("after read");
in.close();
writer.close();
reader.close();
socket.close();
server.close();
}
catch(Exception e3){
e3.printStackTrace();
}
}
}
这个是客户端的:
程序代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;public class ClientTest { public static void main(String[] args) {
new ClientTest(PORT).gogo();
}
private static final int PORT = 400;
private Socket socket;
private InetAddress address;
private PrintWriter writer;
private BufferedReader reader;
private BufferedReader in; //用户写
private Runnable writeThread;
private String humanStr;
private String serverStr;
public ClientTest(int port){
try{
address = InetAddress.getLocalHost();
socket = new Socket(address,port);
}
catch(Exception e1){
e1.printStackTrace();
}
}
public void gogo(){
try{
in = new BufferedReader(new InputStreamReader(System.in));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
writeThread = new Runnable(){
public void run(){
try {
while((humanStr = in.readLine()) != null){
System.out.println("Client: " + humanStr + "\n");
writer.write(humanStr + "\n");
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
};
new Thread(writeThread).start();
//System.out.println("before read");
while ((serverStr = reader.readLine()) != null){
System.out.println("Server: " + serverStr + "\n");
}
//System.out.println("after read");
in.close();
reader.close();
writer.close();
socket.close();
}
catch(Exception e3){
e3.printStackTrace();
}
}
}
求指教哇!!!谢谢。
writer.flush();
好吧,我又试用了一下,换了个port就可以了。
可能是之前的程序还占用了这个port
换了个port,加了
writer.flush();
就OK了!
谢谢
port不要用1024以内的,这些端口被指派给TCP/IP一些重要的应用程序,不过这个程序也没什么关系...呵呵