这几天电脑的Oracle数据库出了问题,把电脑重新安装了一下。多线程的实例拖了这么多天,先直接上代码了。
服务器端代码:
import java.io.*;
import java.net.*;
/** * 服务器端程序
*
* @author JunwenYu
* @time 2013-08-16
*/
public class TestServer {
public static void main(String args[]) {
try {
// 创建一个socket对象
ServerSocket s = new ServerSocket(8888);
// socket对象调用accept方法,等待连接请求
Socket s1 = s.accept();
// =========服务器端,在这里应该先打开输出流,在打开输入流,
// =========因为服务器端执行的操作是先听,再说,听,说,听,说.....
// 打开输出流
OutputStream os = s1.getOutputStream();
// 封装输出流
DataOutputStream dos = new DataOutputStream(os);
// 打开输入流
InputStream is = s1.getInputStream();
// 封装输入流
DataInputStream dis = new DataInputStream(is);
// 创建并启用两个线程
new MyServerReader(dis).start();
new MyServerWriter(dos).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 接受并打印客户端传过来的信息
class MyServerReader extends Thread {
private DataInputStream dis;
public MyServerReader(DataInputStream dis) {
this.dis = dis;
}
public void run() {
String info;
try {
while (true) {
// 如果对方,即客户端没有说话,那么就会阻塞到这里,
// 这里的阻塞并不会影响到其他线程
info = dis.readUTF();
// 如果状态有阻塞变为非阻塞,那么就打印接受到的信息
System.out.println("对方说: " + info);
if (info.equals("bye")) {
System.out.println("对方下线,程序退出!");
System.exit(0);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 从键盘获得输入流并写入信息到客户端
class MyServerWriter extends Thread {
private DataOutputStream dos;
public MyServerWriter(DataOutputStream dos) {
this.dos = dos;
}
public void run() {
// 读取键盘输入流
InputStreamReader isr = new InputStreamReader(System.in);
// 封装键盘输入流
BufferedReader br = new BufferedReader(isr);
String info;
try {
while (true) {
info = br.readLine();
dos.writeUTF(info);
if (info.equals("bye")) {
System.out.println("自己下线,程序退出!");
System.exit(0);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
/**
* 客户端程序
*
* @author JunwenYu
*
* @time 2013-08-16
*/
public class TestClient {
public static void main(String args[]) {
try {
// 创建socket对象,指定服务器的ip地址,和服务器监听的端口号
// 客户端在new的时候,就发出了连接请求,服务器端就会进行处理,如果服务器端没有开启服务,那么
// 这时候就会找不到服务器,并同时抛出异常==》java.net.ConnectException: Connection
// refused: connect
Socket s1 = new Socket("127.0.0.1", 8888);
// =========客户端,在这里应该先打开输入流,在打开输出流,
// =========因为客户端执行的操作是先说,再听,说,听,说,听.....
// 打开输入流
InputStream is = s1.getInputStream();
// 封装输入流
DataInputStream dis = new DataInputStream(is);
// 打开输出流
OutputStream os = s1.getOutputStream();
// 封装输出流
DataOutputStream dos = new DataOutputStream(os);
// 创建并启用两个线程
new MyClientReader(dis).start();
new MyClientWriter(dos).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 接受并打印服务器端传过来的信息
class MyClientReader extends Thread {
private DataInputStream dis;
public MyClientReader(DataInputStream dis) {
this.dis = dis;
}
public void run() {
String info;
try {
while (true) {
info = dis.readUTF();
System.out.println("对方说: " + info);
if (info.equals("bye")) {
System.out.println("对方下线,程序退出!");
System.exit(0);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 从键盘获得输入流并写入信息到服务器端
class MyClientWriter extends Thread {
private DataOutputStream dos;
public MyClientWriter(DataOutputStream dos) {
this.dos = dos;
}
public void run() {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String info;
try {
while (true) {
info = br.readLine();
dos.writeUTF(info);
if (info.equals("bye")) {
System.out.println("自己下线,程序退出!");
System.exit(0);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
今天写贴代码,注释也已经很清楚了,日后再具体来说,或者直接联系我的QQ:445574292。
下一期写一个Java与C用Socket进行通信的例子,也是我们暑期实习时做过的一个例子。客户端用Java做,服务器端用C。