Socket 编程入门

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

服务器端使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。举一个简单的例子

服务器端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;

public class Sever {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(20001);//创建一个SeverSocket对象
		//服务器端的程序循环运行
		while(true){
			Socket s = ss.accept();//接收到客户端的Socket
			PrintStream ps = new PrintStream(s.getOutputStream());//用于先客户端写信息
			BufferedReader sin = new BufferedReader(new InputStreamReader(s.getInputStream()));//接收客户端信息
			String read = null;
			read = sin.readLine();
			System.out.println("收到客户端信息:"+ read);
			ps.println("收到客户端请求");

		}

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.InputStreamReader;

public class Client {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("127.0.0.1",20001);//创建客户端对象,指定端口号
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//用于接收服务器信息
		PrintStream ps = new PrintStream(socket.getOutputStream());
		//用于向服务器发送信息
		String read = null;
		ps.println("向服务器发送信息");
		read = br.readLine();
		System.out.println("收到服务器信息:" +read);
		ps.close();
		br.close();
		socket.close();

	}

}

 以上程序中客户程序运行一次就向服务器发送文字“向服务器发送信息”,并在控制台显示服务器发送过来的文字,服务器端也进行相同的操作

上面的程序中客户端执行一次就退出,服务器端循环执行监听客户端。

以下是升级版,实现简易的多人聊天室功能。服务器负责监听各个客户端的文字并显示给客户端。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class CS_S {

	/**
	 * @param args
	 */
	public static ArrayList<Socket> socketlist = new ArrayList<Socket>();
	//定义一个ArrayList来接收各个客户端的socket
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(30000);
		while(true){
			Socket s = ss.accept();
			socketlist.add(s);//将socket加入arraylist
			new Thread(new CS_SThread(s)).start();//在线程中执行监听
		}

	}

}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintStream;

import java.io.InputStreamReader;
import java.net.Socket;

public class CS_SThread implements Runnable{

	/**
	 * @param args
	 */
	Socket socket = null;
	BufferedReader br = null;
	//定义一个构造函数,接收出入的socket
	public CS_SThread(Socket s ) throws IOException{
		this.socket = s;
		br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	}
	@Override
	public void run() {
		String content = null;
		while((content=readfromclient())!=null){
		//在循环中向每一个客户端的socket中写入信息
			for(Socket s : CS_S.socketlist){
				try {
					PrintStream ps = new PrintStream(s.getOutputStream());
					//写信息
					ps.println(content);
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}
		}
		
	}

	//读取socket中的内容
	private String readfromclient(){
		try {
			return br.readLine();
		} catch (IOException e) {
		//如果报错就把该socket从arraylist中移除
			CS_S.socketlist.remove(socket);
			e.printStackTrace();
		}
		return null;
	}

}

 客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class CS_C {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket s = new Socket("127.0.0.1",30000);
		new Thread(new CS_CThread(s)).start();//起一个线程负责接收服务器发过来的信息
		PrintStream ps = new PrintStream(s.getOutputStream());
		//将客户端写在控制台的信息发送给服务器
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String content = null;
		while((content=br.readLine())!=null){
			ps.println(content);
		}

	}

}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;


public class CS_CThread implements Runnable{
	Socket s = null;
	BufferedReader br = null;
	//构造函数,传入socket
	public CS_CThread(Socket s) throws IOException{
		this.s = s;
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}
	public void run() {
		String content = null;
		try {
			while((content=br.readLine())!=null){
			//输出信息
				System.out.println(content);
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}

 运行程序时先运行服务器端程序,在运行客户端。多个客户端之间可以实现简易的多人聊天功能。

posted @ 2012-12-08 21:11  拙急鸟  阅读(239)  评论(2编辑  收藏  举报