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();
}
}
}
分享到:
相关推荐
通过实践这些例子,并结合Word文档的解释,你应该能够深入理解C#多线程编程的各个方面。 总结来说,C#的多线程特性使得开发人员能够编写出高效且响应迅速的应用程序。理解并熟练掌握多线程的创建、同步、通信和管理...
易语言超线程下载源码项目例子,对于学习者来说,是理解多线程编程和网络编程的良好实践。下面我们将深入探讨相关知识点: 1. **多线程编程**:在易语言中,可以使用“创建线程”命令创建新的执行线程,每个线程...
### Java多线程的使用与介绍 #### 什么是多线程? 多线程是指程序能够同时执行多个线程的能力。...开发者需要不断学习最新的技术和发展趋势,以更好地利用多线程的优势,提高软件的性能和稳定性。
通过学习和分析这个"易语言简单的多线程例子",开发者不仅可以掌握易语言的多线程编程基础,还能了解到如何在实际应用中有效利用多线程提升程序性能。这将对编写高效、响应性强的易语言程序大有裨益。
4. **OpenMP**:Intel的多线程优化可能利用了OpenMP(Open Multi-Processing)库,这是一个跨平台的API,用于简化共享内存多线程编程,通过特定的编译器指令,可以让程序员轻松地控制并行区域。 5. **性能分析**:...
"超级经典java例子"集合很可能包含了一系列展示Java核心特性和类库应用的代码示例。这些例子可以帮助开发者深入理解Java语言,并熟悉如何有效地利用Java API来解决实际问题。 1. **基础语法与数据类型**:Java提供...
总之,通过这个"超简单的多线程例子",初学者可以快速了解易语言中的多线程编程,并逐步提升到更复杂的多线程应用开发。记住,理论结合实践是学习任何编程技能的关键,所以不仅要理解多线程的原理,还要动手去编写和...
综上所述,"超线程下载DLL.zip"易语言项目提供了一个实践多线程下载功能的示例,涵盖了易语言编程、多线程、DLL使用、网络编程等多个重要知识点,对学习和开发具有很高的参考价值。通过研究这个项目,开发者可以增强...
通过深入学习和实践多线程编程,开发者可以设计出更高效、更健壮的软件系统,充分利用现代计算机的多核或多处理器架构,提高程序的并发性能。因此,理解和掌握Java多线程编程不仅是提升现有应用性能的手段,也是适应...
总结来说,这个实验涵盖了C#中的HTTP通信、多线程编程以及断点续传技术,是学习和实践这些核心概念的好例子。通过实现这个项目,开发者不仅可以提升编程技能,还能了解如何解决实际问题,如优化下载性能和提供用户...
通过“JavaScrip例子学习”中的示例,你可以逐步掌握上述知识点,并通过实践不断提升自己的编程技能。无论你是想从事前端开发还是全栈开发,这个资源都将是你宝贵的参考资料。记得动手实践,理论结合实际,才能真正...
7. **多线程编程**:对于复杂游戏,可能需要多线程处理不同的任务,例如在主游戏循环的同时加载新的关卡或处理网络通信。了解易语言中的多线程编程技术对优化游戏性能至关重要。 8. **用户交互**:游戏与用户的互动...
3. **多线程技术**:为了保证用户体验,信使应用通常会采用多线程来处理不同的任务,如接收消息、发送消息、更新联系人列表等。学习源码可以了解如何在易语言中创建和管理线程。 4. **数据序列化与反序列化**:消息...
3. **多线程处理**:如果源码中涉及,可能会用到多线程技术来提高文件浏览的效率,避免阻塞用户界面。 4. **事件驱动编程**:易语言的事件驱动机制使得程序可以根据用户操作动态响应,比如在用户选择列表框中的文件...
这个例子“易语言-易语言 利用超级列表框多线程参数传递文本”着重讲解如何在多线程环境下,通过超级列表框来传递和显示文本数据。 在多线程编程中,通常我们会创建多个执行线程来执行不同的任务,以提高程序的运行...
总的来说,"java多线程導入不同csv文件到不同表1"项目涉及了Java多线程编程、CSV文件处理、数据库操作和异常处理等多个核心知识点,是学习和实践这些技能的好例子。通过优化和扩展这个项目,我们可以构建出更高效、...