http://www.iteye.com/blogs/tag/java%E5%A4%9A%E7%BA%BF%E7%A8%8B
服务器端:
package thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器端
* <p>
* 服务器端打开侦听的端口,一有客户端连接就创建两个新的线程来负责这个连接
*
* 一个负责客户端发送的信息(ClientMsgCollectThread 类),
*
* 另一个负责通过该Socket发送数据(ServerMsgSendThread )
*
* @author Faue
*/
public class DTUServer extends ServerSocket {
private static final int SERVER_PORT = 10000;
private boolean isShakeHandsSuccess = false;
/**
* 构造方法,用于实现连接的监听
*
* @throws IOException
*/
public DTUServer() throws IOException {
super(SERVER_PORT);
try {
while (true) {
Socket socket = super.accept();
// 定时采集
Thread thread = new Thread(new TimerThread(socket),
"getAndShow" + socket.getPort());
thread.start();
// 发送指令
new Thread(new SendInstructionThread(socket), "send"
+ socket.getPort()).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new DTUServer();
}
/**
* 该类用于创建接收客户端发来的信息并显示的线程
* <p>
* 相当于BDR定时
*
* @author Faue
* @version 1.0.0
*/
class TimerThread implements Runnable {
private Socket socket;
private BufferedReader in;
private StringBuffer inputStringBuffer = new StringBuffer("Hello");
/**
* 得到Socket的输入流
*
* @param s
* @throws IOException
*/
public TimerThread(Socket s) throws IOException {
socket = s;
System.out.println("定时采集");
in = new BufferedReader(new InputStreamReader(
socket.getInputStream(), "GBK"));
}
public void run() {
try {
while (!socket.isClosed()) {
if (!isShakeHandsSuccess) {
// 等待握手
String s = in.readLine();
System.out.println("s:" + s);
if (s.equals("握手成功")) {
isShakeHandsSuccess = true;
}
}
if (isShakeHandsSuccess) {
inputStringBuffer.delete(0, inputStringBuffer.length());
System.out.println("阻塞线程,等待客户端发来消息");
inputStringBuffer.append(in.readLine());
System.out
.println(getMsg(inputStringBuffer.toString()));
}
System.out.println("---------------");
}
} catch (Exception e) {
// e.printStackTrace();
System.out.println(socket.toString() + " is closed!");
}
}
/**
* 构造显示的字符串
*
* @param line
* @return
*/
private String getMsg(String line) {
return socket.toString() + " 接收数据:" + line;
}
}
/**
* 该类用于创建发送数据的线程
*
* @author Faue
* @version 1.0.0
*/
class SendInstructionThread implements Runnable {
private Socket client;
private PrintWriter out;
private BufferedReader keyboardInput;
private StringBuffer outputStringBuffer = new StringBuffer("Hello");
/**
* 得到键盘的输入流
*
* @param s
* @throws IOException
*/
public SendInstructionThread(Socket s) throws IOException {
client = s;
System.out.println("ServerMsgSendThread");
out = new PrintWriter(client.getOutputStream(), true);
keyboardInput = new BufferedReader(new InputStreamReader(System.in));
}
public void run() {
try {
while (!client.isClosed()) {
outputStringBuffer.delete(0, outputStringBuffer.length());
System.out.println("开始发送指令...");
outputStringBuffer.append(keyboardInput.readLine());
System.out.println("发送指令结束...");
out.println(outputStringBuffer.toString());
}
} catch (IOException e) {
// e.printStackTrace();
System.out.println(client.toString() + " is closed!");
}
}
}
}
客户端:
package thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 客户端
* <p>
* 实现基于IP地址的连接,连接后也创建两个线程来实现信息的发送和接收
*
* @author Faue
*/
public class Client {
private Socket mySocket;
/**
* 创建线程的构造方法
*
* @param IP
* @throws IOException
*/
public Client(String IP) throws IOException {
try {
mySocket = new Socket(IP, 10000);
// 主线程还没有往下走
shakeHands(mySocket);
new Thread(new ServerMsgCollectThread(mySocket), "getAndShow"
+ mySocket.getPort()).start();
new Thread(new ClientMsgSendThread(mySocket), "send"
+ mySocket.getPort()).start();
} catch (IOException e) {
// e.printStackTrace();
System.out.println("Server.IP:" + IP
+ " port:10000 can not be Connected");
}
}
public static void main(String[] args) throws IOException {
try {
new Client("127.0.0.1");
} catch (Exception e) {
System.out.println("输入的IP地址错误");
}
}
/**
* 该类用于创建接收服务端发来的信息并显示的线程
*
* @author Faue
* @version 1.0.0
*/
class ServerMsgCollectThread implements Runnable {
private Socket client;
private BufferedReader in;
private StringBuffer inputStringBuffer = new StringBuffer("Hello");
/**
* 得到Socket的输入流
*
* @param s
* @throws IOException
*/
public ServerMsgCollectThread(Socket s) throws IOException {
client = s;
in = new BufferedReader(new InputStreamReader(
client.getInputStream(), "GBK"));
}
public void run() {
try {
System.out.println("客户端开始接收循环.....");
while (!client.isClosed()) {
inputStringBuffer.delete(0, inputStringBuffer.length());
System.out.println("等待读入数据.....");
inputStringBuffer.append(in.readLine());
System.out.println(getMsg(inputStringBuffer.toString()));
}
} catch (IOException e) {
// e.printStackTrace();
System.out.println(client.toString() + " is closed!");
System.exit(0);
}
}
/**
* 构造输入字符串
*
* @param line
* @return
*/
private String getMsg(String line) {
return client.toString() + " says:" + line;
}
}
/**
* 该类用于创建发送数据的线程
*
* @author Faue
* @version 1.0.0
*/
class ClientMsgSendThread implements Runnable {
private Socket client;
private PrintWriter out;
private BufferedReader keyboardInput;
private StringBuffer outputStringBuffer = new StringBuffer("Hello");
/**
* 得到键盘的输入流
*
* @param s
* @throws IOException
*/
public ClientMsgSendThread(Socket s) throws IOException {
client = s;
out = new PrintWriter(client.getOutputStream(), true);
keyboardInput = new BufferedReader(new InputStreamReader(System.in));
}
public void run() {
try {
while (!client.isClosed()) {
outputStringBuffer.delete(0, outputStringBuffer.length());
System.out.println("客户端等待写入数据.....");
outputStringBuffer.append(keyboardInput.readLine());
out.println(outputStringBuffer.toString());
}
out.println("--- See you, bye! ---");
} catch (Exception e) {
// e.printStackTrace();
System.out.println(client.toString() + " is closed!");
System.exit(0);
}
}
}
private void shakeHands(Socket s) {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
s.getInputStream(), "GBK"));
StringBuffer outputStringBuffer = new StringBuffer("");
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
while (true) {
String hand = in.readLine();
System.out.println("服务器发过来的握手信息" + hand);
if (hand != null && "FE".equals(hand)) {
outputStringBuffer.delete(0, outputStringBuffer.length());
outputStringBuffer.append("握手成功");
out.println(outputStringBuffer.toString());
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
Java多线程下载 超简单、详细的例子~!供初学者参考学习~!
为了避免不使用线程时界面卡顿,调用了精易模块5.28的线程功能,你不喜欢可以自己去掉或者用上自己写的多线程代码都可。这个关系不大。 其他部分纯源码不涉及其他模块。 软件功能: 1. 首先设定一个要遍历的文件夹...
为了避免不使用线程时界面卡顿,调用了精易模块5.28的线程功能,你不喜欢可以自己去掉或者用上自己写的多线程代码都可。这个关系不大。其他部分纯源码不涉及其他模块。软件功能:。1. 首先设定一个要遍历的文件夹,...
由于会计制度改革,财务的支出按部门核算,我将收入和支出都是自动生成的财务凭证,故而记录数达到了上千条,所以速度超慢,机器配置不好就死机,所以做了个这个小例子共大家学习,比原来的速度提高了很多倍,大家看...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
为了避免不使用线程时界面卡顿,调用了精易模块5.28的线程功能,你不喜欢可以自己去掉或者用上自己写的多线程代码都可。这个关系不大。 其他部分纯源码不涉及其他模块。 软件功能: 1. 首先设定一个要遍历的文件夹,...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
当从XML数据源中加载数据时可以采用多线程的方式(可选),在数据量较大的情况下的可以实现边加载边浏览的效果。 编程接口 提供了简单易学的符合标准的微软Com调用规范的API编程接口,可以帮助开发人员通过编程对...
笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...