《三步学会Java Socket编程.rtf》由会员分享,可在线阅读,更多相关《三步学会Java Socket编程.rtf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、转 三步学会Java Socket编程转 三步学会Java Socket编程第一步仅支持单客户连接的Server-Client程序第一步仅支持单客户连接的Server-Client程序服务器:使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端:客户端:使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态
2、的分配一个1024以上的端口。-建立服务器-import .*;import java.io.*;public class Serverprivate ServerSocket ss;private Socket socket;private BufferedReader in;private PrintWriter out;public Server()tryss=new ServerSocket(10000);while(true)socket=ss.accept();in=new BufferedReader(new InputStreamReader(socket.getInputSt
3、ream();out=new PrintWriter(socket.getOutputStream(),true);String line=in.readLine();out.println(you input is:+line);out.close();in.close();socket.close();ss.close();catch(IOException e)public static void main(String args)new Server();这个程序建立了一个服务器,它一直监听10000端口,等待用户连接。在建立连接后给客户端返回一段信息,然后结束会话。这个程序一次只能接
4、受一个客户连接。建立客户端import java.io.*;import .*;public class ClientSocket socket;BufferedReader in;PrintWriter out;public Client()trysocket=new Socket(xxx.xxx.xxx.xxx,10000);in=new BufferedReader(new InputStreamReader(socket.getInputStream();out=new PrintWriter(socket.getOutputStream(),true);BufferedReader
5、line=new BufferedReader(new InputStreamReader(System.in);out.println(line.readLine();line.close();out.close();in.close();socket.close();catch(IOException e)public static void main(String args)new Client();这个客户端连接到地址为xxx.xxx.xxx.xxx的服务器,端口为10000,并从键盘输入一行信息,发送到服务器,然后接受服务器的返回信息,最后结束会话。第二步支持多客户端同时连接的Ser
6、ver-Client程序第二步支持多客户端同时连接的Server-Client程序在实际的网络环境里,同一时间只对一个用户服务是不可行的。一个优秀的网络服务程序除了能处理用户的输入信息,还必须能够同时响应多个客户端的连接请求。在java中,实现以上功能特点是非常容易的。设计原理:主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。实现消息共享 import java.io.*;import .*;public class Server extend
7、s ServerSocketprivate static final int SERVER_PORT=10000;public Server()throws IOExceptionsuper(SERVER_PORT);trywhile(true)Socket socket=accept();new CreateServerThread(socket);catch(IOException e)finallyclose();/-CreateServerThreadclass CreateServerThread extends Threadprivate Socket client;private
8、 BufferedReader in;private PrintWriter out;public CreateServerThread(Socket s)throws IOExceptionclient=s;in=new BufferedReader(new InputStreamReader(client.getInputStream(),GB2312);out=new PrintWriter(client.getOutputStream(),true);out.println(-Welcome-);start();public void run()tryString line=in.re
9、adLine();while(!line.equals(bye)String msg=createMessage(line);out.println(msg);line=in.readLine();out.println(-See you,bye!-);client.close();catch(IOException e)private String createMessage(String line)xxxxxxxxx;public static void main(String args)throws IOExceptionnew Server();这个程序监听10000端口,并将接入交给
10、CreateServerThread线程运行。CreateServerThread线程接受输入,并将输入回应客户,直到客户输入bye,线程结束。我们可以在createMessage方法中,对输入进行处理,并产生结果,然后把结果返回给客户。第三步实时交互的Server-Client程序第三步实时交互的Server-Client程序网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。下面看看如何开发一个可以实时传递消息的程序。设计原理:服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后
11、把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。源码 import java.io.*;import .*;import java.util.*;import java.lang.*;public class Server extends ServerSocketprivate static ArrayList User_List=new ArrayList();private static ArrayList Threader=new ArrayList();private static LinkedList Message_Array=new Li
12、nkedList();private static int Thread_Counter=0;private static boolean isClear=true;protected static final int SERVER_PORT=10000;protected FileOutputStream LOG_FILE=new FileOutputStream(d:/connect.log,true);public Server()throws FileNotFoundException,IOExceptionsuper(SERVER_PORT);new Broadcast();/app
13、end connection logCalendar now=Calendar.getInstance();String str=+now.getTime().toString()+Accepted a connection015012;byte tmp=str.getBytes();LOG_FILE.write(tmp);trywhile(true)Socket socket=accept();new CreateServerThread(socket);finallyclose();public static void main(String args)throws IOException
14、new Server();/-Broadcastclass Broadcast extends Threadpublic Broadcast()start();public void run()while(true)if(!isClear)String tmp=(String)Message_Array.getFirst();for(int i=0;i 0?false:true;/-CreateServerThreadclass CreateServerThread extends Threadprivate Socket client;private BufferedReader in;pr
15、ivate PrintWriter out;private String Username;public CreateServerThread(Socket s)throws IOExceptionclient=s;in=new BufferedReader(new InputStreamReader(client.getInputStream();out=new PrintWriter(client.getOutputStream(),true);out.println(-Welcome to this chatroom-);out.println(Input your nickname:)
16、;start();public void sendMessage(String msg)out.println(msg);public void run()tryint flag=0;Thread_Counter+;String line=in.readLine();while(!line.equals(bye)if(line.equals(l)out.println(listOnlineUsers();line=in.readLine();continue;if(flag+=0)Username=line;User_List.add(Username);out.println(listOnl
17、ineUsers();Threader.add(this);pushMessage();elsepushMessage(+line);line=in.readLine();out.println(-See you,bye!-);client.close();catch(IOException e)finallytryclient.close();catch(IOException e)Thread_Counter-;Threader.remove(this);User_List.remove(Username);pushMessage();private String listOnlineUsers()String s=-+-Online list-+-015012;for(int i=0;i User_List.size();i+)s+=+User_List.get(i)+015012;s+=-+-+-;return s;private void pushMessage(String msg)Message_Array.addLast(msg);isClear=false;这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入l就可以列出在线人员表。
限制150内