`
Luob.
  • 浏览: 1572389 次
  • 来自: 上海
社区版块
存档分类
最新评论

Socket 点对点 通信

阅读更多
Socket通常称作为 "套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通过Socket向网络发出请求或者应答网络请求.Socket是简历在网络连接时使用,在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.

对于同一个网络连接来说,Socket是平等的,并没有差别,不因为在服务器端或在客户端,而产生不同的级别.

Socket服务器端需要在某个端口上开启服务器端类型类,java.net.ServerSocket.通过Accept()方法用户产生"阻塞",知道接收到一个连接,并且返回一个客户端的Socket对象实例."阻塞"是使程序运行暂时"停留" 在这个地方,直到一个会话产生,然后程序继续,通常 "阻塞"是有循环产生的

Socket客户端根据服务器端的IP地址和端口号 创建一个Socket对象.连接服务器.服务器端和客户端都持有有个Socket对象,服务器端的Socket从服务器端指向客户端,而客户端的Socket从客户端指向服务器端,就像在服务器和客户端建立了两条单向的管道


//ServerSocket 
package com.itheima.net.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

class SocketServer{   //Socket服务器端
	private int prot; //端口

	public SocketServer(int prot) {
		this.prot = prot;
		//这里开始启动监听
		start();
	}
	//处理信息
	public String infoUpperCase(String  line){  
		return line.toUpperCase(); //将字符串大写
	}
	
	//启动服务器
	public void start(){
		try {
			//根据端口创建服务器端Socket对象
			ServerSocket serverSocket=new ServerSocket(prot);
			System.out.println("服务器端口已启动,监听端口号为:"+prot);
			System.out.println("正在等客户端的连接......");
			
			//挂起 等待客户的请求
			Socket socketAccept= serverSocket.accept();
			//读取客户端的数据流
			BufferedReader in=new BufferedReader(new InputStreamReader(socketAccept.getInputStream()));
			
			//获取写往客户端的输出流,true表示自动刷新
			PrintWriter out=new PrintWriter(socketAccept.getOutputStream(),true);
			out.println("服务器端连接成功....");
			out.println("输入exit断开和服务器的连接");
			boolean done=false;
			while(!done){
				String line=in.readLine(); //读取客户端的每一行文本
				if(line==null){
					done=true;
				}else{
					//显示客户端发送的内容
					System.out.println("客户端传来的内容:"+line);
					String message=infoUpperCase(line); //转换信息
					out.println("从服务器端口发送的内容:"+message);
					if(line.trim().equals("exit"))	//退出判断
						done=true;
				}
			}
			socketAccept.close();
		} catch (Exception e) {
			System.out.println("启动服务器端出项错误:"+e.getMessage());
		}
		
		
	}
	
}

public class TextSocketServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			SocketServer server=new SocketServer(8080); //传入端口实例化对象
		} catch (Exception e) {
			System.out.println("测试服务器端监听出错:"+e.getMessage());
		}
	}
	

}


//SocketClient

package com.itheima.net.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

class Client{
	
	private String host;   //IP地址或域名 
	private int prot;      //端口号
	public Client(String host, int prot) {
		this.host = host;
		this.prot = prot;
		//这里开始连接 
		connectionSocket();
	}
	
	//连接的方法
	public void connectionSocket(){
		try {
			Socket socketConn;
			
			if(host.equals("localhost") || host.equals("127.0.0.1")){
				socketConn=new Socket(InetAddress.getLocalHost(),prot);
			}else{
				socketConn=new Socket(InetAddress.getByName(host),prot);
			}
			
			//获得从键盘的输入流
			BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
			
			//获得服务器内容的数据流
			PrintWriter out=new PrintWriter(socketConn.getOutputStream(),true); 
			
			//获得服务器端发送内容的缓冲流
			BufferedReader in=new BufferedReader(new InputStreamReader(socketConn.getInputStream()));
			
			System.out.println("服务器信息:"+in.readLine());  //从服务器端获取信息
			System.out.println("服务器信息:"+in.readLine());
			System.out.print("请输入>");
			boolean done=false;
			while(!done){
				String line=stdin.readLine(); 		//获得从键盘输入的每行字符 
				out.println(line);					//发送到服务器端
				if(line.equalsIgnoreCase("exit"))
					done=true;
				String info=in.readLine();
				System.out.println("服务器信息:"+info);
				if(!done)
					System.out.println("请输入>");
			}
			socketConn.close();
		} catch (SecurityException e) {
			System.out.println("连接服务器出现安全问题:"+e.getMessage());
		}catch (Exception e) {
			System.out.println("连接服务器出现I/O错误:"+e.getMessage());
		}
	}
	
	
}

public class TextSocketClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new Client("localhost", 8080);	
		} catch (Exception e) {
			System.out.println("测试客户端连接出错:"+e.getMessage());
		}
	}
	
	

}
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics