Socket ServerSocket 互聊

public class Server {

public static void main(String[] args) {
	try {
		//服务端打开端口8888
		ServerSocket ss=new ServerSocket(8888);
		//在8888端口上监听,看是否有连接请求进来
		System.out.println("监听在端口号:8888");
		Socket s=ss.accept();
		
		new Thread() {
			public void run() {
				while(true){
					//使用readUTF读取字符串
				String msg=null;
				try {
				//打开输入流接收
				InputStream is=s.getInputStream();
				//把输入流封装在DataInputStream
				DataInputStream dis=new DataInputStream(is);	
				msg = dis.readUTF();	
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();	
				}
				//打印出来
				if(msg!=null) {
					System.out.println("客户端输出:"+msg);
				}
				}
				
			}
		}.start();
		
		
		
		new Thread() {
			public void run() {
				while(true) {
					String str=null;
				try {
					//输出
					OutputStream os=s.getOutputStream();
					DataOutputStream dos=new DataOutputStream(os);
					Scanner sc=new Scanner(System.in);
					str=sc.next();
					dos.writeUTF(str);
					
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
				if(str!=null) {
					System.out.println("服务端输入:"+str);	
				}
				}
				
				
			}
		}.start();			
		
		
	}catch(IOException e) {
		e.printStackTrace();
	}
}

}

public class Client {
/*如下ip地址可以连接
192.********.2
192.********.101
192.********.102
192.********.105
192.********.108
192.********.113*/
//**杀死进程**
/*1.启动cmd, 执行命令netstat -ano|findstr  1099 ,会查询出占用端口号的进程号,这时候执行命令
taskkill -f -pid 进程号   杀死进程,然后重启Tomcat即可解决*/
public static void main(String[] args) {
	try {
		//连接到本机的8888端口
		Socket s=new Socket("127.0.0.1",8888);
		//打开输入流,输入
		InputStream is=s.getInputStream();
		DataInputStream dis=new DataInputStream(is);
		//接受信息线程
		new Thread() {
			public void run() {
				while(true) {
				String msg=null;	
					try {
						msg= dis.readUTF();
					} catch (IOException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
					if(msg!=null) {
						System.out.println("服务端端输出:"+msg);
					}
					
				}
			}
		}.start();
		//打开输出流,输出
		OutputStream os=s.getOutputStream();
					//把输出流封装在DataOutputStream中
					DataOutputStream dos=new DataOutputStream(os);
					//使用writeUTF发送字符串//dos.writeUTF("legendary");
					//使用Scanner读取控制台的输入,并发送到服务端
		new Thread() {
			public void run() {//加一个while(true)才能循环起来
				while(true) {
					String str=null;
				try {
					Scanner sc=new Scanner(System.in);
					str=sc.next();
					dos.writeUTF(str);
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
				if(str!=null) {
					System.out.println(str);	
					}
				}	
			}
		}.start();
	}catch(UnknownElementException e) {
		e.printStackTrace();
	}catch(IOException e) {
		e.printStackTrace();
	}
}
}//先运行server再运行client

ServerScoket类

  • 创建一个ServerSocket类,同时再运行该语句的计算机指定端口处建立一个监听服务 ServerScoket MyListener =new ServerSocket(600);
  • 这里指定提供监听服务的端口是600,一台计算机可以同时提供多个服务, 这些不同的服务之间通过端口号来区别,不同的端口号上提供了不同的服务。
  • 为了可以随时检体哦那个可能的Client请求,执行如下语句 Socket LinkSocket=MyListener.accept();
  • 该语句采用了ServerSocket对象的accept()方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,
  • 并返回一个用于与该Client通信的Socket对象Link-Socket。此后Server 程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。
  • 结束监听时,关闭ServerSocket对象:Mylistener.close();

Socket类

  • 当Client程序需要从Server端获取信息及其他服务时,应创建一个Socket对象
  • Socket MySocket=new Socket(“ServerComputerName”,600);
  • Socket类的构造函数有两个参数,第一个参数是连接到Server计算机的主机地址,第二个参数是该Server机上提供服务的端口号。
  • Socket对象建立成功之后,就可以再Client和Server之间建立一个连接,并通过这个连接再两个端点之间传递数据。
  • 利用Socket类的方法getOutputStream()和getInputStream()分别获得向Socket读写数据的输入/输出流,最后将从Server端读取的数据返还到Server端。
  • 当Server和Client端的通信结束时,可以调用Socket类的close方法关闭Socket,拆除连接。
  • ServerSocket一般用于设置端口号和监听,真正进行通信的是服务器端的Socket与客户端的Socket,
  • 再ServerSocket进行accept后,就将主动权转让了

1.服务器端程序设计

  • 在服务器端,利用ServerSocket类的构造函数ServerSocket(int port)创建一个ServerSocket类的对象,port参数传递端口,这个端口就是服务器监听连接请求的端口
  • 如果在这时出啊先错误将抛出IOException异常对象,否则将创建ServerSocket对象并开始准备接收连接请求。
  • 服务程序从调用ServerSocket的accept()方法开始,直到连接建立。在建立连接后,accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序IP地址或端口号。

2.客户端程序设计

  • 当客户程序需要与服务器程序通信时,需要在客户机创建一个Socket对象。Socket类有构造函数Socket(int Address addr,int port)和Socket(String host, int port),
  • 两个构造函数都创建了一个基于Socket的连接服务器断流套接字。对于第一个int address子类通过address参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,
  • 如果没有IP地址与host参数相一致,那么将抛出UnknownnHostException异常对象。两个函数都通过port获得服务器的端口号。假设已经建立了连接,
  • 网络API将在客户端基于Socket的流套接字中捆绑客户程序的IP地址和任意一个端口号,否则两个函数都会抛出一个IOException对象。
  • 如果创建了一个Socket对象,那么它可以通过getInputStream()方法从服务端程序获得输入流读传送来的消息,也可以通过调用getOutputStream()方法获得输入流来发送消息。在读写活动完成之后,
  • 客户端程序调用close()方法关闭流和流套接字。
  • 内容来自:https://www.cnblogs.com/mareymarey111/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值