java服务器 长任务 java服务器通信
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套接字建立服务器 .ServerSocket ss = new .ServerSocket(port); System.out.println("服务器建立成功~! "+port); //2、当客户机接入后,一直待机等待数据输入输出 .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 .UnknownHostException; public class DrawClient { public void conn2Server(){ try { //1、建立客户端 .Socket client = new .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窗口通过端口映射连接到本地端口,也可以得到服务器收发而来的信息,如果我们将多线程运用到通信中后,我们可以进一步打开多个窗口,而且同时运行,互不干扰。