javasocket编程: 3步学会Java Socket编程

步 充分理解Socket   1.什么是   所谓通常也称作"套接字"用于描述IP地址和端口个通信链句柄应用通常通过"套接字"向网络发出请求或者应答网络请求   以J2SDK-1.3为例Socket和ServerSocket类库位于java.net包中ServerSocket用于服务器端Socket是建立网络连接时使用在连接成功时应用两端都会产生个Socket例子操作这个例子完成所需会话对于个网络连接来说套接字是平等并没有差别在服务器端或在客户端而产生区别级别不管是Socket还是ServerSocket它们工作都是通过SocketImpl类及其子类完成   重要Socket API:   java.net.Socket继承于java.lang.Object有 8个构造器其思路方法并不多下面介绍使用最频繁 3个思路方法其它思路方法大家可以见JDK-1.3文档   . Accept思路方法用于产生"阻塞"直到接受到个连接并且返回个客户端Socket对象例子"阻塞"是个术语它使运行暂时"停留"在这个地方直到个会话产生然后继续;通常"阻塞"是由循环产生   . getInputStream思路方法获得网络连接输入同时返回个IutputStream对象例子   . getOutputStream思路方法连接端将得到输入同时返回个OutputStream对象例子   注意:其中getInputStream和getOutputStream思路方法均会产生个IOException它必须被捕获它们返回流对象通常都会被另个流对象使用   2.如何开发个Server-Client模型   开发原理:   服务器使用ServerSocket监听指定端口端口可以随意指定(由于1024以下端口通常属于保留端口些操作系统中不可以随意使用所以建议使用大于1024端口)等待客户连接请求客户连接后会话产生;在完成会话后关闭连接   客户端使用Socket对网络上某个服务器个端口发出连接请求旦连接成功打开会话;会话完成后关闭Socket客户端不需要指定打开端口通常临时、动态分配个1024以上端口   {建立服务器} import java.net.*; import java.io.*; public Server { private ServerSocket ss; private Socket ; private BufferedReader in; private PrWriter out; public Server { try { ss = ServerSocket(10000); while (true) { = ss.accept; in = BufferedReader( InputStreamReader(.getInputStream)); out = PrWriter(.getOutputStream,true); String line = in.readLine; out.prln("you input is :" + line); out.close; in.close; .close; } ss.close; } catch (IOException e) {} } public void (String args) { Server; } }   这个建立了个服务器直监听10000端口等待用户连接在建立连接后给客户端返回段信息然后结束会话这个次只能接受个客户连接   {建立客户端} import java.io.*; import java.net.*; public Client { Socket ; BufferedReader in; PrWriter out; public Client { try { = Socket("xxx.xxx.xxx.xxx", 10000); in = BufferedReader( InputStreamReader(.getInputStream)); out = PrWriter(.getOutputStream,true); BufferedReader line = BufferedReader( InputStreamReader(.in)); out.prln(line.readLine); line.close; out.close; in.close; .close; } catch (IOException e) {} } public void (String args) { Client; } }   这个客户端连接到地址为xxx.xxx.xxx.xxx服务器端口为10000并从键盘输入行信息发送到服务器然后接受服务器返回信息最后结束会话 第 2步 多个客户同时连接   在实际网络环境里时间只对个用户服务是不可行个优秀网络服务除了能处理用户输入信息还必须能够同时响应多个客户端连接请求在java中实现以上功能特点是非常容易   设计原理:   主监听端口等待客户接入;同时构造个线程类准备接管会话个Socket会话产生后将这个会话交给线程处理然后主继续监听运用Thread类或Runnable接口来实现是不错办法   {实现消息共享} import java.io.*; import java.net.*; public Server extends ServerSocket { private final SERVER_PORT = 10000; public Server throws IOException { super(SERVER_PORT); try { while (true) { Socket = accept; CreateServerThread(); } } catch (IOException e) {} finally { close; } } //--- CreateServerThread CreateServerThread extends Thread { private Socket client; private BufferedReader in; private PrWriter out; public CreateServerThread(Socket s) throws IOException { client = s; in = BufferedReader( InputStreamReader(client.getInputStream, "GB2312")); out = PrWriter(client.getOutputStream, true); out.prln("--- Welcome ---"); start; } public void run { try { String line = in.readLine; while (!line.equals("bye")) { String msg = createMessage(line); out.prln(msg); line = in.readLine; } out.prln("--- See you, bye! ---"); client.close; } catch (IOException e) {} } private String createMessage(String line) { xxxxxxxxx; } } public void (String args) throws IOException { Server; } }   这个监听10000端口并将接入交给CreateServerThread线程运行CreateServerThread线程接受输入并将输入回应客户直到客户输入"bye"线程结束我们可以在createMessage思路方法中对输入进行处理并产生结果然后把结果返回给客户 第 3步 实现信息共享:在Socket上实时交流   网络伟大的也是信息共享Server可以主动向所有Client广播消息同时Client也可以向其它Client发布消息下面看看如何开发个可以实时传递消息   设计原理:   服务器端接受客户端连接请求同时启动个线程处理这个连接线程不停读取客户端输入然后把输入加入队列中等候处理在线程启动同时将线程加入队列中以便在需要时候定位和取出   {源码} import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public Server extends ServerSocket { private ArrayList User_List = ArrayList; private ArrayList Threader = ArrayList; private LinkedList Message_Array = LinkedList; private Thread_Counter = 0; private boolean isClear = true; protected final SERVER_PORT = 10000; protected FileOutputStream LOG_FILE = FileOutputStream("d:/connect.log", true); public Server throws FileNotFoundException, IOException { super(SERVER_PORT); Broadcast; //append connection log Calendar now = Calendar.getInstance; String str = "[" + now.getTime.toString + "] Accepted a connection\015\012"; tmp = str.getBytes; LOG_FILE.write(tmp); try { while (true) { Socket = accept; CreateServerThread(); } } finally { close; } } public void (String args) throws IOException { Server; } //--- Broadcast Broadcast extends Thread { public Broadcast { start; } public void run { while (true) { (!isClear) { String tmp = (String)Message_Array.getFirst; for ( i = 0; i < Threader.size; i) { CreateServerThread client = (CreateServerThread)Threader.get(i); client.sendMessage(tmp); } Message_Array.removeFirst; isClear = Message_Array.size > 0 ? false : true; } } } } //--- CreateServerThread CreateServerThread extends Thread { private Socket client; private BufferedReader in; private PrWriter out; private String Username; public CreateServerThread(Socket s) throws IOException { client = s; in = BufferedReader( InputStreamReader(client.getInputStream)); out = PrWriter(client.getOutputStream, true); out.prln("--- Welcome to this chatroom ---"); out.prln("Input your nickname:"); start; } public void sendMessage(String msg) { out.prln(msg); } public void run { try { flag = 0; Thread_Counter; String line = in.readLine; while (!line.equals("bye")) { (line.equals("l")) { out.prln(listOnlineUsers); line = in.readLine; continue; } (flag 0) { Username = line; User_List.add(Username); out.prln(listOnlineUsers); Threader.add(this); pushMessage("[< " + Username + " come _disibledevent= false; } } }
Tags:  windowssocket编程 socket编程 javasocket javasocket编程

延伸阅读

最新评论

发表评论