TCP/UDP套接字 java socket编程实例

网络协议七层结构:

什么是Socket?

  socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口。使用socket编程也称为网络编程,socket只是接口并不是网络通信协议。

HTTP协议和Socket的区别

  http协议是应用层,其模式是请求-应答,客户端发送请求,服务器端进行响应。传输的数据是原始格式的数据,eg :json、xml、text等数据格式。

  socket不是协议是接口,socket提供TCP/UDP socket 的实例,供java 或者其他语言操作数据的传输,socket是对传输层(TCP/UPD协议)的封装。

Socket通信分为两种

  TCP Socket :使用流传输,提供inputStream 和 outputStream 方法对数据进行流操作。要理解TCP套接字首先要对TCP协议有所理解。

    1)TCP协议是传输层的协议,他的下一层是IP协议(网络层),IP协议在网络数据传输是通过ip寻址,将源地址和目的地址进行连接。TCP协议是在IP协议上多加一层端口寻址,光只通过IP寻址只能定位到主机,tcp通过端口找到对应的应用程序。

    2)TCP 建立连接需要三次握手,将源应用程序和目的应用程序之间搭建一个连接,所以源应用和目的应用程序之间必须是one by one。IP 协议只管数据的传输,不保证数据是否丢失,重复传,顺序是否正确,TCP会对这些问题做一些补偿机制,丢失数据重传,用队列保证数据的顺序。

    3) TCP 缺点:因为每个客户端和服务器端传输数据都要建立连接,三次握手是不传输数据并且有耗时,当有大量短连接的时候并且对数据的正确性要求不高的时候,将会占用带宽。

  UDP Socket:使用数据报文进行传输,创建UDP socket 发送和接收数据报文。

    1)UDP协议同TCP协议一样都是应用层协议,也是通过端口寻址,找到对应的应用程序。

    2)UDP传输数据报文不需要和目的应用程序建立连接,他在数据报文中指定目的主机和目的端口号,发送出的数据自动寻址到对应的主机和端口号。因为不用和目的主机建立连接,所以一个源应用程序可以以广播的形式将数据报文传输给多主机。因为不用建立连接,耗时和带宽占用量都比TCP协议更优秀

    3)UDP缺点:数据有可能丢失,丢失的数据不会重传

java socket 实例

  TCP Socket client

package socket.transmission.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

//TCP 套接字 客户端负责发送请求
public class TcpClient {
    private static  final  int BUF_SIZE=32;
    /**
     * TCP客户端发送一个请求要有三个步骤:
     *  1.创建一个socket的实例,创建一个指向server主机ip和端口号的TCP连接
     *  2.通过套接字的输入和输出流进行通信
     *  3.使用socket close关闭
     */
    public static void main(String[] args){
      String ip="192.168.197.1";
        int port=8080;
        try {
            // 创建一个socket实例
            Socket socket=new Socket(ip,port);
            System.out.println("创建一个socket连接");
            InputStream inputStream=socket.getInputStream();
            OutputStream outputStream=socket.getOutputStream();
            //向socket中写入数据
            outputStream.write("this is a word".getBytes());
            int totalByrecive=0;  //到目前为止接收到的数据
            byte[] readBuff=new byte[BUF_SIZE];
            int lastReadByte;  //最后接收的字节
            System.out.println("从服务器中接收的数据:");
            int receiveMsgSize;
            while ((receiveMsgSize=inputStream.read(readBuff))!=-1){
                System.out.println(new String(readBuff));
            }
             socket.close();  //关闭
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

tcp sokect server

package socket.transmission.tcp;

//TCP 服务器端进行接收请求

import sun.java2d.pipe.OutlineTextRenderer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

/**
 * TCP服务器对客户端发送的请求会进行以下处理
 *  1.创建serverSocket实例并且指定本机端口,功能:监听指定端口发送过来的连接
 *  2.重复执行:
 *      1).调用的serverSocket 的accept() 监听客户端发送过来的请求,并创建socket
 *      2).使用socket的inputStream 和  outputStream 进行通讯
 *      3).通信完使用socket.close() 方法将连接关闭
 */
public class TcpServer {

    private static  final  int BUF_SIZE=32;

    public static void main(String[] args){
        int port=8080;
        Socket socket = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            ServerSocket serverSocket=new ServerSocket(port);//创建一个socket实例用于监听客户端发送的连接
            System.out.println("创建serverSocket 实例");
            int reviceMsgSize;   // 接收msg的大小
            byte[] receiveBuf=new byte[BUF_SIZE];  //创建一个信息接收的缓冲区
                System.out.println("开始处理接收的数据");
                while (true) {
                    socket = serverSocket.accept();  //接收客户端的连接
                    SocketAddress socketAddress = socket.getRemoteSocketAddress(); //
                    System.out.println("访问的地址:" + socketAddress);
                    inputStream = socket.getInputStream();
                    outputStream = socket.getOutputStream();
                    while ((reviceMsgSize = inputStream.read(receiveBuf)) != -1) {
                        System.out.println(new String(receiveBuf));
                        outputStream.write("aaaaa".getBytes(), 0, 4);
                    }
                    outputStream.flush();
                    socket.close();
                }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
                try {
                    if(socket!=null){
                        socket.close();
                    }
                    if(inputStream!=null){
                        inputStream.close();
                    }
                    if(outputStream!=null){
                        outputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }

}

原文地址:https://www.cnblogs.com/blogxiao/p/9304107.html

时间: 2024-11-11 15:30:04

TCP/UDP套接字 java socket编程实例的相关文章

java套接字(socket)实例

客户端socket 流程: 1.连接远程主机 2.发送数据 3.接收数据 4.关闭流与socket连接 实例: import java.io.*; import java.net.Socket; import java.util.Date; /** * Created by CLY on 2017/7/11. */ public class ClientSocket { public static void main(String[] arg){ int port = 233;//与之连接的服务

Python学习笔记九(UDP套接字和并发编程)

一.UDP套接字 服务端 from socket import * server = socket(AF_INET,SOCK_DGRAM) server.bind(("127.0.0.1",8080)) while True: data,client_addr = server.recvfrom(1024) server.sendto(data.upper(),client_addr) 客户端 from socket import * client = socket(AF_INET,S

TCP/UDP套接字网络协议

TCP服务端(以字节串传输信息) import socket 1.创建套接字 sockfd = socket.socket(socket_family = AF_INET,socket_type = SOCK_STREAM,proto = 0) 功能:创建一个IPv4的流式套接字,括号中的创建IPv4流式套接字的时候可以不写,有缺省值. 参数:socket_family 地址族类型 AF_INET 表示IPv4网络通信 socket_type 套接字类型 SOCK_STREAM 流式  SOCK

java socket编程实例代码讲解

1.所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 操作java socket时用到的最多的三个方法为: accept():主要用于服务器端产生"阻塞",等待客户端的链接请求,并且返回一个客户端的Socket实例: getInputStream():方法主要用来获得网络连接输入,同时返回一个InputStream对象实例: getOutputStream

TCP和UDP套接字编程 (java实现)

在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程接口! 关于TCP和UDP这里就不作太多介绍了,我们知道TCP是面向连接的,UDP是不面向连接的,TCP可靠,UDP不可靠即可! 我们来设计一个应用来示范一下,流程: 客户机从键盘读取一行字符串,并通过套接字发送到服务器. 服务器从连接的套接字获取这行字符串,并对其进行修改(将小写转为大写),最后再

【Java】Java网络编程菜鸟进阶:TCP和套接字入门

Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持.本文开始探讨 TCP. TCP 基础知识 在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换.TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制.

【Python网络编程】利用Python进行TCP、UDP套接字编程

之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器. 2.服务器从其连接套接字读取一行字符. 3.服务器将该行字符转换成大写. 4.服务器将修改后的字符串(行)通过连接套接字再发回给客户机. 5.客户机从其套接字中读取修改后的行,然后将该行在其标准输出(监视器)上打印出来. [TCP]服务器端代码: import socket

python开发socket网络编程基础:粘包问题&udp套接字

一,发生粘包 服务器端 1 from socket import * 2 phone=socket(AF_INET,SOCK_STREAM) #套接字 3 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #解决端口占用 4 phone.bind(('127.0.0.1',8080)) #绑定端口和Ip到套接字 5 phone.listen(5) 6 conn,client_addr=phone.accept() #等待tcp接受 7 8 9 # data1

探索UDP套接字编程

UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务,而TCP提供面向流.提供可靠数据服务.注意,UDP和TCP没有好坏之分,只是二者的适用场景不同罢了. 典型的UDP套接字编程模型是客户端不予服务端建立连接,而只是调用sendto函数来向服务端发送数据,其中必须要指定服务端的信息,包括IP和端口等:服务端不接收来自客户端的连接,而只是调用recvfr