----------------------
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