Socket网络编程

使用Socket可以非常方便的进行通信,主要分成两个部分:

第一个部分ServerSocket,服务端等待客户端的连接;

第二个部分Socket,客户端连接服务端。

ServerSocket的使用方法如下

int port=23456;
ServerSocket server=new ServerSocket(port);
while(true){//等待客户端的连接
	Socket ss=server.accept();
    //收取客户端发送来的消息
	BufferedReader br=new BufferedReader(new InputStreamReader(ss.getInputStream()));
	String line=br.readLine();
	System.out.println(line);
}

Socket的使用方法如下

String ip="192.168.1.113";
int port=23456;
Socket socket=new Socket(ip,port);
//发送消息给服务端
OutputStream os=socket.getOutputStream();
os.write("你好".getBytes("utf-8"));
os.close();

当服务端和客户端建立连接之后,可以互相发送消息和收取消息,

使用getOutputStream()方法进行发送消息,getInputStream()方法进行接收消息。

由于网络操作响应时间不确定,因此把这类操作放入新线程当中,以避免主程序长时间阻塞。

以下是对socket操作的封装类,并且将网络操作放入了新线程当中。

public class MySocket {
	
	private int port;
	
	private ServerSocket server;
	
	private List<Message> msgList;
	
	public MySocket(int port){
		this.port=port;
		msgList=new ArrayList<Message>();
		
		try{
		   server=new ServerSocket(port);
		   acceptThread.start();//开启接受信息线程
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	//发送消息线程
	public void send(Message msg){

		Thread sendThread=new Thread(){

			@Override
			public void run() {
				super.run();
				try {
					Socket socket = new Socket(msg.getIp(),msg.getPort());
					OutputStream os=socket.getOutputStream();
					os.write(msg.getContent().getBytes("utf-8"));
					os.close();
					socket.close();
				}catch (IOException e) {
					e.printStackTrace();
				}
				
			}
			
		};
		sendThread.start();
	}
	

	//接受信息的线程
	private Thread acceptThread=new Thread(){

		@Override
		public void run() {
			super.run();
			while(true){
				try {
					Socket socket=server.accept();
					InputStream is=socket.getInputStream();
					String content=new BufferedReader(new InputStreamReader(is)).readLine();
					Message message=new Message();
					message.setIp(socket.getInetAddress().toString());
					message.setPort(socket.getPort());
					message.setContent(content);
					msgList.add(message);
					System.out.println(message.getContent());
					is.close();
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	};
}

其中所使用到的Message类如下

public class Message {
	
	private String ip;//ip地址
	private int port;//端口号
	private String content;//信息内容
	
	public Message(){ }
	
	public Message(String ip,int port,String content){
		this.ip=ip;
		this.port=port;
		this.content=content;
	}
	
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public int getPort() {
		return port;
	}
	public void setPort(int port) {
		this.port = port;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
}
posted @ 2016-09-01 16:24  黄大仙爱编程  阅读(128)  评论(0编辑  收藏  举报