网络编程(1)—TCP
来源:互联网 发布:淘宝陆川铁锅哪家正宗 编辑:程序博客网 时间:2024/06/08 07:33
java.net 包中提供了两种常见的网络协议的支持:
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
TCP协议:
- 使用TCP协议前需要建立TCP链接形成数据传输通道
- 传输前采用三次握手方式,是可靠的
- TCP协议进行通信的两个应用进程:客户端、服务端
- 在连接中可进行大数据量的传输
- 传输完毕,释放链接,效率低
- Socket编程
- 通信的两端都要有Socket
- 网络通信其实就是Socket之间通信
- Socket允许程序把网络链接当成一个流,数据在两个Socket间通过IO传输
- 发起请求的一端叫客户端,等待请求的一端为服务端
*网络编程基本步骤:
TCP网络编程步骤:
- 1.创建客户端Socket
- 2.Socket调用getOutputStream()方法,创建输出流(输入流)
- 3.调用write()方法,写入数据
- 4.接受来自服务端的信息
*(若信息是双向传递的,即信息-来-回,而非单向传递,则需要在发送信息之后加上socket.shutdownOutput(),表示信息已发送完毕) - ———————————————
- 5.创建服务端ServerSocket
- 6.ServerSocket调用accept()方法,获取socket
- 7.Socket调用getInputStream(),获取输入流
- 8.接受来自客户端的信息
- 9.处理来自客户端是信息
- 10.返回信息给客户端
- 11.关闭连接资源
TCP编程实例:
1.实例一:
客户端给服务端发送消息,服务端把消息输出到控制台上(单向发送消息)
//信息单向传递
//客户端—发送消息
//服务端—接收消息
public class TestTCP { //客户端 @Test public void client(){ Socket socket = null;//初始化时要置空,否则在finally语句中,关闭连接时会报错 OutputStream os = null; try { //1.首先创建Socket,通过构造器指明服务端的IP地址以及接受程序的端口号 socket = new Socket(InetAddress.getByName("localhost"), 9090); //2.Socket调用getOutputStream,创建流,发送数据 os = socket.getOutputStream(); //3.通过流,发送信息 os.write("我是客户端!".getBytes()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(os != null){ //4.关闭链接 try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if(socket != null){ //5.关闭Socket链接 try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } //服务端 @Test public void server(){ ServerSocket ss = null; Socket s = null; InputStream is = null; try { //1.创建ServerSocket对象,通过构造器指明自身的端口号 ss = new ServerSocket(9090); //2.调用accept(),返回一个Socket对象 s = ss.accept(); //3.调用Socket对象的getInputStream()获取一个从客户端发送过来的输入流 is = s.getInputStream(); //4.从流中读取数据,存到Byte[]数组中 byte[] b = new byte[20]; int len; while((len = is.read(b)) != -1){ //先用String str接收 String str = new String(b, 0, len); System.out.print(str); System.out.println("收到来自"+s.getInetAddress().getHostName()+"的信息"); } } catch (IOException e) { e.printStackTrace(); }finally{ //关闭资源 if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if(s != null){ try { s.close(); } catch (IOException e) { e.printStackTrace(); } } if(ss != null){ try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
2.实例二:
- 客户端给服务端发送消息,服务端将消息打印到控制台上,同时发送“已收到信息”给客户端(一来一回消息传递)
*信息双向发送
*客户端:发送信息–接受信息
*客户端(信息发送完毕之后要显示的告诉服务端,发送完毕!)
*服务端:接受信息–发送信息
代码:
public class TestTCP1 { //客户端 @Test public void client(){ //1.创建Socket对象 Socket socket = null; //2.输出流 OutputStream os = null; //接收来自服务器的响应信息,输入流 InputStream is = null; try { //socket = new Socket(InetAddress.getLocalHost(), 8989);作用同下一样 socket = new Socket(InetAddress.getByName("127.0.0.1"), 8989); os = socket.getOutputStream(); //发送信息,到服务器,写信息 String st = new Scanner(System.in).nextLine(); os.write(st.getBytes("GBK")); socket.shutdownOutput();//输出完毕 is = socket.getInputStream(); int len; byte[] b = new byte[20]; //接收信息,来自服务器的信息 System.out.print("客户端:已发送!\n"); while((len = is.read(b)) != -1){ String str = new String(b,0,len,"GBK"); System.out.print(str); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if(os != null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } //服务端 @Test public void server(){ //1.ServerSocket对象 ServerSocket ss = null; Socket s = null; //2。输入流对象 InputStream is = null; //服务器响应,返回发送信息 OutputStream os = null; try { ss = new ServerSocket(8989); s = ss.accept(); is = s.getInputStream(); byte[] b = new byte[20]; int len; //接收客户端发送的消息 //System.out.print(""); while((len = is.read(b)) != -1){ String str = new String(b,0,len,"GBK"); System.out.print(str); } //发送信息 os = s.getOutputStream(); os.write("服务端已收到消息,啦啦啦啦啦啦啦!".getBytes("GBK")); } catch (IOException e) { e.printStackTrace(); }finally{ if(os != null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if(s != null){ try { s.close(); } catch (IOException e) { e.printStackTrace(); } } if(ss != null){ try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
3.实例三:
- 从客户端发送文件到服务端,服务端保存到本地,并返回“发送成功!”给客户端,关闭相关链接
- 客户端:首先读文件进来到程序(入)—发送文件(出)—接受返回信息(入)
- 服务端:接受文件(入)—程序写出文件保存本地(出)—返回信息(出)
代码:
public class TestTCP2 { //客户端 @Test public void client(){ //1.创建Socket对象 Socket socket = null; //2.创建文件对象,创建输入流对象(文件首先要加读入到程序中) FileInputStream fis = null; //3.输出流,进行文件传输 OutputStream os = null; //6.接受发送成功后返回信息 InputStream is1 = null; try { socket = new Socket(InetAddress.getByName("127.0.0.1"),9898); os = socket.getOutputStream(); fis = new FileInputStream(new File("file/1.jpg")); //5.传输文件,文件首先要读入到程序(len = is.read(b)),再写出(os.write(b, 0, len);) byte[] b = new byte[1024]; int len; //文件读入到程序,并进行传输 while((len = fis.read(b)) != -1){ os.write(b, 0, len); } //6.发送完毕 socket.shutdownOutput(); //7.接收返回的信息 is1 = socket.getInputStream(); byte[] b1 = new byte[20]; int leng; while((leng = is1.read(b1)) != -1){ String str = new String(b1, 0, leng); System.out.println(str); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(is1 != null){ try { is1.close(); } catch (IOException e) { e.printStackTrace(); } } if(os != null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if(fis != null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } }} //服务端 @Test public void server(){ //1.服务端ServerSocket ServerSocket ss = null; //2.调用accept()方法,返回一个Socket对象 Socket s = null; //3.接受数据 InputStream is = null; //4.创建文件对象,用于承载数据 FileOutputStream fos = null; //6.返回信息 OutputStream os1 = null; try { ss = new ServerSocket(9898); s = ss.accept(); is = s.getInputStream(); fos = new FileOutputStream(new File("file/1_1.jpg")); //5.接收数据(len = is.read()),写出文件(os.write()) byte[] b = new byte[1024]; int len; while((len = is.read(b)) != -1){ fos.write(b , 0 , len); } os1 = s.getOutputStream(); os1.write("发送成功!".getBytes()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(os1 != null){ try { os1.close(); } catch (IOException e) { e.printStackTrace(); } } if(fos != null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if(s != null){ try { s.close(); } catch (IOException e) { e.printStackTrace(); } } if(ss != null){ try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
阅读全文
0 0
- java网络编程—TCP(1)
- 网络编程(1)—TCP
- 网络编程—TCP
- 网络编程(TCP)
- 网络编程(TCP)
- 网络编程(TCP)
- Qt网络编程———TCP(1)
- 网络编程——TCP(1)
- JAVA——网络编程(TCP)
- TCP/IP网络编程(1)
- JAVA 网络编程(TCP传输1)
- Java学习—网络编程(TCP)
- 网络编程(1):计算机网络与TCP/IP网络模型
- 网络编程1----TCP通信
- TCP/IP网络编程1
- QT网络编程—TCP
- 网络编程(tcp协议)
- 网络编程TCP(一)
- mysql方法大全
- 我是如何学习Android源码的
- CoordinatorLayout的使用
- sizeof(数组名)和sizeof(指针)
- 使用 Java.util.LinkedHashMap 实现 LRU、FIFO 算法
- 网络编程(1)—TCP
- CardView的使用
- 解决EasyUi的combobox绑定change事件
- Kinect Depth Sensor和外部相机配准
- CentOS7使用firewalld打开关闭防火墙与端口
- 面试题3:数组中重复的数字
- 讲座倒计时:抓紧报名!还剩1天,20个赠教材名额!
- Palette的使用
- 阿里云CentOS7 搭建apache+php+mysql环境,并配置多站点多域名