2008年10月10日星期五

java二人聊天工具(两个线程)

上次那是单线程的,所以只能发一句,收一句。
改进了下,使用多线程的了。能够收发互不影响。
不过至少有一个缺陷在于:虽然发了信息之后马上就关闭了socket,但立刻一个while循环,开始了新的socket的建立,很是浪费网络啊。。。要改下也不难,在clientThread里面,在cin.readLine()函数之后再建立socket。现在懒得搞了,后面再看吧。
还有些Exception啥的,都没搞懂,就是说程序不是那么的安全,以后慢慢搞。写下代码特此纪念。
一共三个文件:
clientThread.java // 发信息线程。
serverThread.java // 收信息线程。
JavaIM.java // 主程序。
还是没注释……继续汗。。

发现还是有些注释,多半是从别人的代码上修改来的。。。
我这里先运行的clientThread,我觉得serverThread要一直等待着被main()创建,就放后面了。



// File name: JavaIM.java
import java.io.*;
import java.net.*;

public class JavaIM extends ServerSocket {
protected static final int SERVER_PORT = 10000;

public JavaIM() throws IOException {

super(SERVER_PORT);
new ClientThread(); // Create a clientThread to
// connect and send message
// Listening the port 10000
try {
while (true) {

Socket socket = accept(); // Accept a connection
new ServerThread(socket); // Create a serverThread
// To receive messages
}
} finally {
close();
}
}

public static void main(String[] args) throws IOException {
new JavaIM();
}
}









// File name: ClientThread.java
import java.io.*;
import java.net.*;

public class ClientThread extends Thread {

private String sentence;
private String username;

Socket clientSocket;
DataOutputStream outToServer;
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));

public ClientThread() throws IOException {

System.out.println("Input you nickname: ");
while((username = cin.readLine()).length() == 0) {
System.out.println("Empty, please input a valid nickname: ");
}

start();
}

public void run() {

while (true) {

try {
clientSocket = new Socket("192.168.0.100",10000);
outToServer = new DataOutputStream(clientSocket.getOutputStream());
sentence = cin.readLine();
outToServer.writeBytes("<" + username + ">" + sentence + "\n");
clientSocket.close();
} catch(UnknownHostException u) { }
catch(IOException e) { }
}
}
}








// File name: ServerThread.java
import java.io.*;
import java.net.*;

//--- ServerThread
class ServerThread extends Thread {

private Socket client;
private BufferedReader in;
private String sentence;

public ServerThread(Socket s) throws IOException {

client = s;
in = new BufferedReader(new InputStreamReader(client.getInputStream()));

start();
}

public void run() {
try {
sentence = in.readLine();
System.out.println(sentence);
client.close();
} catch (IOException e) {
}
finally {
try {
client.close();
} catch (IOException e) {
}
}
}
}

没有评论: