java Socket编程基础

                今天开始又要复习java基础部分的知识了,我最薄弱的就是网络编程,线程,io这几块,趁平时放假好好把这几部分的基础知识补上,为下一轮面试做好准备。今天从Socket入门开始,做了一个小的P2P 的Demo ,其实网络编程也并不是很难,懂一些协议的原理利用java就可以实现两台电脑之间的点对点通信。基本原理就两句话:作为服务器端, ServerSocket 在初始化的时候会不断的去监听客户端的请求,当服务器端接受的客户端Socket的请求的时候,服务器端也会产生一个Socket和客户端对应完成通信的功能;作为客户端,一旦指定Socket 的IP和端口,便可以向服务器对应的端口发送连接请求;由此便可以轻松的实现点对点的通信。缺点就是,只能交互式的你一言我一语,不能完成并发的功能,希望这个回合的复习结束时我能把多线程加上。

Server代码:

package edu.hue.jk.socket;

import java.io.BufferedReader;

/***
 * 
 * @author dell
 *作为服务器端, ServerSocket 在初始化的时候会不断的去监听客户端的请求
 *当服务器端接受的客户端Socket的请求的时候,服务器端也会产生一个Socket和客户端对应完成通信的功能
 */
public class Server {
	public static void main(String[] args)throws Exception {
		 ServerSocket server=new ServerSocket(30000);   //  创建一个ServerSocket用于监听服务器端的请求
		 while(true){    // 服务器端不断的监听客户端的请求
			Socket serverSocket=server.accept();  // 当监听客户端的请求时,服务器端也会产生一个对应的Socket 来处理和客户端之间的通信
			PrintStream ps=new PrintStream(serverSocket.getOutputStream());// 得到服务器端Socket的输出流,用来向客户端发送信息
			ps.println("您好,服务器已经连接成功");
			ps.flush();
			System.out.println("服务器连接成功");
			InputStream in=serverSocket.getInputStream();  // 得到服务器Socket的输入流,用来读取客户端的内容
			BufferedReader read=new BufferedReader(new InputStreamReader(in)); // 将输入流进行包装
			String msg=null;
			while(true)    // 当客户端有信息发送过来的时候,服务器端接受一条数据,并向客户端回复
			{ 
				msg=read.readLine();
				System.out.println("来自客户端的信息:"+msg);
				System.out.println("请输入信息:");
				BufferedReader readFromkey=new BufferedReader(new InputStreamReader(System.in)); // 用来从键盘中获取信息
				msg=readFromkey.readLine();  // 从键盘中得到信息
				ps.println(msg);
				ps.flush();
			}
//			 ps.close(); //  关闭打印流       应该try  catch finally 这里直接做了异常抛出处理
//			 serverSocket.close();  // 关闭服务器端socket
			 
		 }
	}

}

Client 代码:

package edu.hue.jk.socket;

import java.io.BufferedReader;

public class Client {
	/**
	 * @param args
	 * 作为客户端,一旦指定Socket 的IP和端口,便可以向服务器对应的端口发送连接请求
	 */
	public static void main(String[] args) throws Exception{
		Socket client=new Socket("127.0.0.1",30000); // 向指定的服务器发送连接请求
		
		InputStream in=client.getInputStream();  // 得到客户端Socket的输入流,用来读取服务器端的内容
		BufferedReader read=new BufferedReader(new InputStreamReader(in)); // 将输入流进行包装
		String msg=null;
		while(true){  // 只要服务器有信息反馈,客户端就接受信息,并向服务端发送信息
			msg=read.readLine();
			System.out.println("来自服务器的信息:"+msg);
			System.out.println("请输入信息:");
			PrintStream write=new PrintStream(client.getOutputStream()); // 包装客户端Socket 的输出流用来向服务器端发送数据
			BufferedReader readFromkey=new BufferedReader(new InputStreamReader(System.in)); // 用来从键盘中获取信息
			msg=readFromkey.readLine();  // 从键盘中得到信息
			write.println(msg);// 向服务器发送信息	
			write.flush();
		}
//		finally{
//			read.close();
//			client.close();s
//		}
	}
}

在命令行下的测试结果:

发布了47 篇原创文章 · 获赞 4 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章