黑马程序员_Java Socket 的通信
来源:互联网 发布:数据挖掘 编辑:程序博客网 时间:2024/06/05 06:44
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
Java Socket
服务器端:
[java]package qy.server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MyServer {
private ServerSocket serverSocket; //
private ExecutorService servicePool; // 线程池
public MyServer(int port) {
try {
this.serverSocket = new ServerSocket(port);
this.servicePool = Executors.newFixedThreadPool(5);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new MyServer(6666).service();
}
public void service() {
int i = 0;
while (true) {
try {
Socket socket = this.serverSocket.accept(); // 接受到一个连接,并且返回一个客户端的Socket对象实例
this.servicePool.execute(new Handler(socket));
System.out
.println("User " + i + " is connecting to the Server");
i++;
} catch (IOException e) {
e.printStackTrace();
this.servicePool.shutdown();
}
}
}
class Handler implements Runnable {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
// 一个输入流,用于获取客户端传来的内容
DataInputStream dis = new DataInputStream(
this.socket.getInputStream());
// 用于产生服务器准备响应的内容
DataOutputStream dos = new DataOutputStream(this.socket.getOutputStream());
String str;
while (null != (str = dis.readUTF())) {
System.out.println(str);
if ("exit".equals(str)) {
System.out.println("客户端发出中断请求");
dos.writeUTF("服务器已经关闭本次连接.");
dos.flush();
// dos.writeUTF("exit"); //
// dos.flush();
dos.close();
dis.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
然后,客户端:
[java]
package qy.client;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class MyClient {
public static void main(String[] args) {
try {
Socket client = new Socket("localhost", 6666);
MyClient me = new MyClient();
new Thread(me.new Handler(client)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
class Handler implements Runnable {
private BufferedReader br;
private DataOutputStream dos;
private DataInputStream dis;
private Socket socket;
private boolean flag = true; // 用于控制循环结束
public Handler(Socket s) throws IOException {
this.br = new BufferedReader(new InputStreamReader(System.in)); // 用于从控制台接受输入的信息,再发送到服务器
this.socket = s;
this.dos = new DataOutputStream(this.socket.getOutputStream()); // 向服务器写数据的输出流
this.dis = new DataInputStream(this.socket.getInputStream()); // 获取服务器返回数据的输入流
}
@Override
public void run() {
while (flag) {
try {
String str = br.readLine();
if ("exit".equals(str)) { // 客户端终止发送信息标记 exit
this.br.close();
this.dos.writeUTF(str);
this.dos.flush();
String res = dis.readUTF();
System.out.println(res);
this.dis.close();
this.dos.close();
this.flag = false;
} else {
this.dos.writeUTF(str);// 每读一行就发送一行
this.dos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
遇到的问题:
最先考虑的是使用BufferedReader和BufferedWriter来完成双向数据的写入写出,但是发现BufferedWriter在fush()的时候并不能把从控制台得到的数据立即发送到服务端,就改用DataOutputStream数据流来完成双向数据传递。
- 黑马程序员_Java Socket 的通信
- 黑马程序员_Java的socket编程
- 黑马程序员_java Socket编程
- 黑马程序员_java中的网络编程Socket
- 黑马程序员_java之Socket网络编程
- 黑马程序员_JAVA之GUI与Socket
- 黑马程序员_JAVA的IO
- 黑马程序员_java的由来
- 黑马程序员_Java的封装
- 黑马程序员_Java的基本常识
- 黑马程序员_java的反射
- 【黑马程序员】网络通信机制和Socket的简单了解
- 黑马程序员_Java的集合类型
- 黑马程序员_java复杂的流
- 黑马程序员_JAVA反射机制的理解
- 黑马程序员_java中synchronized的使用
- 黑马程序员_java枚举的学习心得
- 黑马程序员_Java虚拟机的学习
- devel包的由来
- 迭代器模式——Iterator
- out,ref,params的区别
- BSP_WINCE_ARM_A8_User_Guide
- Sicily2012每周一赛第14场题解
- 黑马程序员_Java Socket 的通信
- 为RichTextBox控件添加行号
- linux 命令杂记
- getBytes()方法详解
- netlink通信机制分析
- 黑马程序员_Java 多线程
- 组合模式——Composition
- 关于不同进制的标志
- jQuery ajax中使用serialize() 方法提交表单数据