Java实现服务器与客户端通信
基础要点
我们的需求是用Java实现服务器与客户端通信,在Java类库中有相应使用简单的类库,了解基本原理不难实现服务器和客户端通信
1、编程之前我们要对TCP/IP协议有一定的了解,知道Socket套接字的基本用法。
2、关于数据的传输方式,我们要掌握Java中IO流的使用,服务器发出的输出流的所有信息都会成为客户端的输入流,同时所有客户端的所有输出流都会包含在服务器的输入流中。
3、一般服务器绝不可能只为一个客户端服务,当存在很多客户端的时候,需要为每个客户端的链接建立独立的线程,使得客户端之间不会干扰,独立运行。
线程的控制实现方法有两种:
(1).自定义线程类继承Thread,并重现run()方法;
(2).自定义一个普通类,实现Runnable接口。
在以上要点的基础上,尝试编程
代码示例
//服务器代码模拟
package com.DrawServer;
import java.io.IOException;
public class DrawServer {
public void setServer(int port){
try {
//1、使用socket套接字建立服务器
java.net.ServerSocket ss = new java.net.ServerSocket(port);
System.out.println("服务器建立成功~! "+port);
//2、当客户机接入后,一直待机等待数据输入输出
java.net.Socket client = ss.accept();
System.out.println("有个客户机进来了。。。。");
//3、建立输入输出流
java.io.InputStream ins = client.getInputStream();
java.io.OutputStream ous = client.getOutputStream();
//尝试给客户端输出一句话
String s = "Who are you ?";
byte[] data = s.getBytes();
ous.write(data);
//尝试读取输入的数据
int t = ins.read();
while(t!='a'){
System.out.println("读到的一个字节是 "+ t);
t = ins.read();
}
//关闭服务器
client.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
DrawServer ds = new DrawServer();
ds.setServer(9998);
}
}
//客户端代码模拟
package com.Client;
import java.io.IOException;
import java.net.UnknownHostException;
public class DrawClient {
public void conn2Server(){
try {
//1、建立客户端
java.net.Socket client = new java.net.Socket("127.0.0.1",9998);
System.out.println("连接成功!");
//2、建立输入输出流
java.io.InputStream insInputStream = client.getInputStream();
java.io.OutputStream out = client.getOutputStream();
//读取数据并输出一句话
while(true){
int t = insInputStream.read();
System.out.println("读取的是 "+ t);
String msgString = "bccdef";
byte[] data = msgString.getBytes();
out.write(data);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
DrawClient dsClient = new DrawClient();
dsClient.conn2Server();
}
}
除了运行代码构建客户端以外,我们还可以cmd窗口通过端口映射连接到本地端口,也可以得到服务器收发而来的信息,如果我们将多线程运用到通信中后,我们可以进一步打开多个窗口,而且同时运行,互不干扰。