现在的位置: 首页 > 综合 > 正文

黑马程序员_Socket学习日记之TCP的讲解与应用

2018年02月17日 ⁄ 综合 ⁄ 共 4287字 ⁄ 字号 评论关闭

                                             ----------------------
android培训
java培训、期待与您交流! ----------------------

TCP传输
建立客户端Socket和ServerSocket服务器端

建立连接后通过Socket中的IO流进行数据的传输
(当连接一旦建立,那么这条流会自动连接成功)
关闭Socket (释放端口)
跟UDP一样 客户端和服务端是两个独立的应用程序
对于客户端的建立和应用基本思路:
	*客户端需要明确的服务器的ip地址以及端口号 这样擦可以去试着建立连接,如果连接失败会出现异常
	*连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输而Socket对象以及提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可
	*与服务器通讯结束后.关闭Socket
-----对于服务端的建立和应用基本思路:
	*服务端需要明确的他要处理的数据是从哪个端口进入的。
	*当有客户访问时,要证明是哪个客户端对象,并通过该对象通过IO流进行数据传输
	*当客户端访问结束时关闭该客户端
**通过Socket建立对象并指定要连接的服务主机以及端口
示例代码:
	Socket s = new Socket(“192.168.1.1”,9999);//建立Socket对象建立客户端对象并指定要服务的主机的ip地址和设定端口号
	OutputStream out = s.getOutputStream();//在建立连接成功后获取Socket对象的输出流
	out.write(“hello”.getBytes());//将文本文字写入Socket对象的流中
	s.close();//关闭资源,释放端口
**建立服务端需要监听一个端口
	ServerSocket ss = new ServerSocket(9999);//建立ServerSocket服务端对象并指定监听一个端口
	Socket s = ss.accept ();//如果服务端与客户端建立连接成功那么可以获取一个客户端对象
	InputStream in = s.getInputStream();//获取客户端输入流对象
	byte[] buf = new byte[1024];
	int num = in.read(buf);
	String str = new String(buf,0,num);
	System.out.println(s.getInetAddress().toString()+”:”+str);
	s.close();
	ss.close();//释放资源
**TCP传输最容易出现的问题
	--当客户端连接上服务端两端都在等没有热河数据传输。
	因为IO流对象的Read和ReadLine都是属于阻塞式方法
	一种是:解决的方式是自定义结束标记
	另外一种是:使用Socket服务对象的shutDowninput和shutDownOutput	

TCP协议使用的对象和原理。
	客户端Socket:指定目标主机地址和端口,进行连接 连接成功形成Socket读取流
-------------------------------
下面是利用TCP协议写的一个简单的上传文件的小程序
//客户端
ublic class Clent {
	public static void main(String[] args) throws Exception, Exception {
		System.out.println("这是客户端");
		Socket s=new Socket("10.1.31.50",10001);
		BufferedReader br=new BufferedReader(new FileReader("1.txt"));
		PrintWriter out=new PrintWriter(s.getOutputStream(),true);
		String line=null;
		while((line=br.readLine())!=null){
			out.println(line);
		}
		s.shutdownOutput();
		//此处缺少结束标记
		 out.println("over");
		BufferedReader bufOut=new BufferedReader(new InputStreamReader(s.getInputStream()));
		String text= bufOut.readLine();
		System.out.println(text);
		
	}
}
//服务端
public class Server {
	public static void main(String[] args) throws Exception {
		System.out.println("这是服务端");
		ServerSocket ss=new ServerSocket(10001);
		Socket s=ss.accept();
		System.out.println(s.getInetAddress().getHostAddress()+"......connent");
		BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
		PrintWriter in=new PrintWriter(new FileWriter("10.txt"),true);
		String line;
		while((line=br.readLine())!=null){
			if("over".equals(line))
				break;
			System.out.println("server"+line);
			in.println(line);
		}
		PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
		pw.println("上传成功");
		in.close();
		br.close();
		s.close();
		ss.close();
	}
}

/*--------->有一个小应用对刚刚学到的只是一个巩固  ^_^....
   客户端键入用户名在服务端进行验证
   如果该用户存在那么在服务端显示用户名
   并且在客户端显示登录成功
   如果用户不存在那么服务端显示用户名+用户名不存在
   限定输入三次
*/
 //客户端
public class LoginClent {
	public static void main(String[] args) throws Exception, Exception {
		System.out.println("当前是在客户端");
			Socket s=new Socket("10.1.31.50",10003);
			System.out.println("请输入一个name");
			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
			PrintWriter out=new PrintWriter(s.getOutputStream(),true);//true代表自动刷新
			BufferedReader serOut=new BufferedReader(new InputStreamReader(s.getInputStream()));
			for (int i = 0; i <3; i++) {
				String line=br.readLine();
				if(line==null)
					break;
				out.println(line);
				String text=serOut.readLine();
				System.out.println("服务端反馈回来的信息"+text);
				if(text.contains("欢迎")){
					break;
				}
			}
			br.close();
			serOut.close();
			s.close();
	}
}
public class LoginServer {
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(10003);
		Socket s=ss.accept();
		
			new Thread(new UserThread(s)).start();
		
	}
}

class UserThread extends Thread {
	Socket s = null;

	public UserThread(Socket s) {
		this.s = s;
	}

	@Override
	public void run() {
		try {
			for (int i = 0; i < 3; i++) {
				System.out.println(s.getInetAddress().getHostAddress()+".......");
				BufferedReader br = new BufferedReader(new InputStreamReader(s
						.getInputStream()));
				String name = br.readLine();// 因为只有一行数据不用循环
				PrintWriter out = new PrintWriter(s.getOutputStream(), true);
				// 读取数据库
				BufferedReader dataBR = new BufferedReader(new FileReader(
						"user.txt"));
				String line = null;
				boolean falg = false;
				while ((line = dataBR.readLine()) != null) {
					if (name.equals(line)) {
						falg = true;
						break;
					}

				}
				if (falg) {
					System.out.println(name + "登陆成功");
					out.println(name + "欢迎光临!");
					break;
				} else {
					System.out.println(name+"尝试登陆");
					out.println(name+"用户不存在");
				}
			}
			s.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
有些东西刚开始真的很是很晕但是俗话说的好“晕着晕着就不晕了”  好了 该睡觉了 学习固然重要 身体更重要 对吧 本钱!


 

                    ----------------------
android培训
java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima

抱歉!评论已关闭.