TCP/IP通信协议
网络通信协议:
速率,传输码率,代码结构,传输控制
TCP/IP协议簇:实际上是一组协议
Telenet:远程登陆服务的标准协议,TCP/UDP协议簇的一员,应用层
TCP:用户传输协议 ,传输层
UDP:用户数据报协议,传输层
IP:网络互连协议, 网络层
FDDI ,IEEE802.IA,数据链路层
TCP UDP对比
TCP:eg:打电话
1.连接,稳定
2.三次握手,四次挥手
注:至少三次握手才能保证稳定连接
3.客户端,服务端
4.传输完成,释放连接,效率低
UDP:eg:发短信
。不连接,不稳定
。客户端,服务端,没有明确界限
。不管有没有准备好,都可以发送给客户端
TCP实现聊天
package com.cl.lesson02; //客户端 //实现聊天 import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo01 { public static void main(String[] args) { Socket socket=null; OutputStream os=null; try{ //1.要知道服务器地址 InetAddress serverIP=InetAddress.getByName("127.0.0.1"); int port=9999; //2.创建一个socket连接 socket = new Socket(serverIP,port); //3.发送信息IO流 os=socket.getOutputStream(); os.write("weclome to ".getBytes()); }catch (Exception e){//catch捕获 e.printStackTrace(); }finally { if (os!=null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try{ socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } //tcp实现连接 //客户端: /* 1.连接服务器Socket 2.发送消息 服务器 1.建立服务端口SeverSocket 2.等待用户的连接accpet 3.接收用户消息 * */ package com.cl.lesson02; //服务端 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo01 { public static void main(String[] args) { ServerSocket serverSocket=null; Socket socket=null; InputStream is=null; ByteArrayOutputStream baos=null; try { //new一个地址 serverSocket = new ServerSocket(9999); //2.等待客户端链接过来 socket= serverSocket.accept(); //3.读取客户端的消息 is=socket.getInputStream(); //管道流 baos=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int len; while((len=is.read(buffer))!=-1){ baos.write(buffer,0,len); } System.out.println(baos.toString()); }catch(IOException e){ e.printStackTrace(); }finally { //关闭资源 if (baos!=null){ try { baos.close(); } catch (IOException e) { e.printStackTrace(); } } if (is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } if (serverSocket!=null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } //try catch finally抛出异常处理 /* *java 的异常处理中, 在不抛出异常的情况下,程序执行完 try 里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有 finally 的代码块, 如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法; 如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码, 若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法; 若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。 在抛出异常的情况下,原理也是和上面的一样的, * */
TCP实现文件上传
package com.cl.lesson02; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo02 { public static void main(String[] args) throws Exception { //1.创建一个Socket连接 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000); //2.创建一个输出流 OutputStream os = socket.getOutputStream(); //3.读取文件 FileInputStream fis = new FileInputStream(new File("king.jpg")); //4.写出文件 byte[] buffer = new byte[1024]; int len; while ((len=fis.read(buffer))!=1){ os.write(buffer,0,len); } //5,关闭资源 fis.close(); os.close(); socket.close(); } } package com.cl.lesson02; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo02 { public static void main(String[] args) throws IOException { //1.创建服务 ServerSocket serverSocket = new ServerSocket(9000); //2.监听客户端的连接 Socket socket = serverSocket.accept();//阻塞式监听,直到有客户连接才会继续向下运行 //3.获取输入流 InputStream is = socket.getInputStream(); //4.文件输出 FileOutputStream fos = new FileOutputStream(new File("receive")); byte[] buffer = new byte[1024]; int len; while((len=is.read(buffer))!=-1){ fos.write(buffer,0,len); } //关闭资源 fos.close(); is.close(); socket.close(); serverSocket.close(); } }