您的位置:首页 > 其它

如何开发一个SocketServer-Client模型的程序

2012-11-01 10:21 459 查看
   开发原理:

   服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

   客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

   {建立服务器}

package org.tx;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class socketServer

{

ArrayList clientList = new ArrayList();

public static void main(String[] args)

{

//在main函数中,启动服务器的socket

new socketServer().OpenServer();

}

public void OpenServer()//启动socketServer

{

try

{

ServerSocket server = new ServerSocket(10001);//端口设为10001

Socket socket;

while((socket = server.accept())!=null)

{

clientList.add(socket);

//clientName = socket.getInetAddress().toString();

//output = new DataOutputStream(socket.getOutputStream());

//input = new DataInputStream(socket.getInputStream());

new readClient(socket).start();

new writeClient(socket).start();

}

}

catch(Exception e)

{System.out.println(e.toString());}

}

public class readClient extends Thread

{

private Socket socket;

public readClient(Socket client)

{socket = client;}

public void run()

{

String msg;

try

{

String clientName = socket.getInetAddress().toString();

DataOutputStream output = new DataOutputStream(socket.getOutputStream());

DataInputStream input = new DataInputStream(socket.getInputStream());

while((msg = input.readUTF())!=null)

{

System.out.println("收到消息:【"+clientName+"】 "+msg);

}

}

catch(Exception e){System.out.println(e.toString());}

}

}

public class writeClient extends Thread

{

private Socket socket;

public writeClient(Socket client)

{socket = client;}

public void run()

{

try{

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

String userInput;

String clientName = socket.getInetAddress().toString();

DataOutputStream output = new DataOutputStream(socket.getOutputStream());

DataInputStream input = new DataInputStream(socket.getInputStream());

while(true)

{

if(stdIn.ready())

{

userInput = stdIn.readLine();

if(userInput!="exit")

{

output.writeUTF(userInput);

System.out.println("已发送消息给【"+clientName+"】"+userInput);

}

}

}

}

catch(Exception e) {System.out.println(e.toString());}

}

}

}

   这个程序建立了一个服务器,它一直监听10001端口,等待用户连接。在建立连接后给客户端返回一段信息,然后结束会话。这个程序一次只能接受一个客户连接。

   {建立客户端}

package org.tx;

import java.net.ServerSocket;

import java.net.Socket;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class socketClient

{

private DataOutputStream output;

private DataInputStream input;

private String clientName;

public static void main(String[] args)

{

//在main函数中,启动服务器的socket

new socketClient().ConnectServer();

}

public void ConnectServer()

{

try

{

Socket socket = new Socket("127.0.0.1",10001);//

clientName = socket.getInetAddress().toString();

input = new DataInputStream(socket.getInputStream());

output = new DataOutputStream(socket.getOutputStream());

new readServer().start();

new writeServer().start();

}

catch(Exception e) {System.out.println(e.toString());}

}

public class readServer extends Thread

{

private Socket client;

public void run()

{

String msg;

try

{

while(true)

{

msg = input.readUTF();

if(msg!=null)

System.out.println("收到消息:【"+clientName+"】 "+msg);

}

}

catch(Exception e) {System.out.println(e.toString());}

}

}

public class writeServer extends Thread

{

private Socket client;

public void run()

{

try

{

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

String userInput;

while(true)

{

if(stdIn.ready())

{

userInput = stdIn.readLine();

if(userInput!="exit")

{

output.writeUTF(userInput);

System.out.println("已发送消息给【"+clientName+"】"+userInput);

}

}

}

}

catch(Exception e) {System.out.println(e.toString());}

}

}

}

   多个客户同时连接,主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。这个客户端连接到地址为xxx.xxx.xxx.xxx的服务器,端口为10001,并从键盘输入一行信息,发送到服务器,然后接受服务器的返回信息,最后结束会话。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐