Java网络编程Socket通信

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议

    UDP (User Datagram Protocol 用户数据报协议)是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务

TCP与UDP基本区别

  •   1.基于连接与无连接
  •   2.TCP要求系统资源较多,UDP较少; 
  •   3.UDP程序结构较简单 
  •   4.流模式(TCP)与数据报模式(UDP); 
  •   5.TCP保证数据正确性,UDP可能丢包 
  •   6.TCP保证数据顺序,UDP不保证 

一、Tcp协议通信

     1、Server服务器端:

  • a、创建ServerSocket对象,同时绑定监听端口
  • b、通过accept()方法监听客户端的请求
  • c、建立连接后,通过输入流读取客户端发送的请求信息
  • d、通过输出流向客户端发送响应信息
  • e、关闭相应资源
package com.yyx.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerSocket {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            // 创建一个ServerSocket的对象,通过构造器指明自身的端口号
            serverSocket = new ServerSocket(9090);
            // 服务端监听 调用其accept()方法,返回一个Socket的对象
            socket = serverSocket.accept();
            inputStream = socket.getInputStream();

            String pathname = "F:" + File.separator + "target.jpg";
            File file = new File(pathname);
            fileOutputStream = new FileOutputStream(file);

            /*
             * 接收客户端发送文件,并保存到本地文件
             */
            byte[] b = new byte[1024];
            int len;
            while ((len = inputStream.read(b)) != -1) {
                fileOutputStream.write(b, 0, len);
            }

            String strInfo = "你发送的图片我已接收成功!";
            outputStream = socket.getOutputStream();
            outputStream.write(strInfo.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭相应的流以及Socket、ServerSocket的对象
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (inputStream != null) {
                try {
                    inputStream.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();
                }
            }
        }

    }
} 

 2、Client客户端:

  • a、创建Socket对象,指明需要连接的服务器的地址和端口号
  • b、建立连接后,通过输出流向服务器端发送请求信息
  • c、通过输入流获取服务器的响应信息
  • d、关闭相应资源
package com.yyx.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClientSocket {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream outputStream = null;
        InputStream inputStream = null;
        FileInputStream fileInputStream=null;
        try {
            // 创建一个Socket的对象,通过构造器指明服务端的IP地址,以及其接收程序的端口号
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);

            String pathname = "F:" + File.separator + "source.jpg";
            File file = new File(pathname);
            fileInputStream=new FileInputStream(file);

            // getOutputStream():发送数据,方法返回OutputStream的对象
            outputStream = socket.getOutputStream();
            byte[] b = new byte[1024];
            int len;
            while ((len = fileInputStream.read(b)) != -1) {
                outputStream.write(b, 0, len);
            }

            // shutdownOutput():执行此方法,显式的告诉服务端发送完毕!
            socket.shutdownOutput();

            inputStream = socket.getInputStream();
            byte[] bAnother = new byte[1024];
            int lenAnother;
            while ((lenAnother = inputStream.read(bAnother)) != -1) {
                String str = new String(bAnother, 0, lenAnother);
                System.out.print(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭相应的流和Socket对象,从后往前关闭
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

二、Udp协议通信

     客户端

package com.yyx.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClientSocket {
    public static void main(String[] args) {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket();
            String str = "你好,我是要发送的数据";
            byte[] b = str.getBytes();

            /*
             * 创建一个数据报:每一个数据报不能大于64k,都记录着数据信息,发送端的IP、端口号,以及要发送到 的接收端的IP、端口号
             */
            DatagramPacket pack = new DatagramPacket(b, 0, b.length, InetAddress.getByName("127.0.0.1"), 9090);

            datagramSocket.send(pack);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (datagramSocket != null) {
                datagramSocket.close();

            }
        }
    }
}

服务端

package com.yyx.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpServerSocket {
    public static void main(String[] args) {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(9090);
            byte[] b = new byte[1024];
            DatagramPacket pack = new DatagramPacket(b, 0, b.length);
            datagramSocket.receive(pack);

            String str = new String(pack.getData(), 0, pack.getLength());
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (datagramSocket != null) {
                datagramSocket.close();

            }
        }
    }
}

原文地址:https://www.cnblogs.com/xianya/p/9216962.html

时间: 2024-08-08 22:08:34

Java网络编程Socket通信的相关文章

java网络编程Socket通信详解

Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术.下面就让我们一起揭开Socket的神秘面纱. Socket编程 一.网络基础知识(参考计算机网络)            关于计算机网络部分可以参考相关博客:           <TCP/IP协议栈及OSI参考模型详解> http://wangdy.blog.51cto.com/3845563/

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

java网络编程socket解析

转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在C/S通信模式中,client需要主动创建于server连接的Socket(套接字).服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可看做是通信两端的收发器.server与client都通过Socket来收发数据. 1.构造Socket 1.Socket() 2.So

Java网络编程——Socket

网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据. Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通信机制. 当然,Socket本身是独立于编程语言之上的概念,就像数据结构与算法一样,它并不属于Java,而是一种公认的通信的解决方案,大部分语言都实现了与socket相关的通信功能. 原理 Socket通过使用TCP(传输控制协议)提供了两台计算机之间的通信机制.具体的方式是:服务器处会首先创建Se

java 网络编程(Socket) TCP/UDP 总结案例

网络编程:关注的是底层的数据传输 网页编程:数据的展示 1.基本概念 一.网络:将不同的计算机连接在一起局域网 城域网 互联网 二.地址:Ip地址确定网络上的绝对的地址位置   房子的地址 三.端口号(相当于房门):区分计算机上的软件 相当于房门两个字节0~65535 共65536个 1. 同一个协议下,端口号不能重复,不同的协议下可以重复 2. 1024以下的端口不要使用 80-->http 21-->ftp 四.资源定位 URL 统一资源定位 URI:统一资源 五.数据的传输 1. 协议:

java网络编程——socket实现简单的CS会话

还记得当年学计网课时用python实现一个简单的CS会话功能,这也是学习socket网络编程的第一步,现改用java重新实现,以此记录. 客户端 import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.Socket; public class Client { public static void main(String[] args)throws IOE

JAVA网络编程--UDP通信

首先网络传输数据需了解例如以下三点 1.找到对方IP 2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行了标识.为了方便称呼这个数字,叫做port,逻辑port 3.  定义通信规则.这个通信规则称为协议. 国际组织定义了通用协议TCP/IP. 127.0.0.1本机回环地址 不易记忆,可用主机名 主机名:localhost 0-65535port范围 0-1024系统使用或保留port .当中mysql的port号为 3306 一.UDP UDP相对于

JAVA网络编程TCP通信

Socket简介: Socket称为"套接字",描述IP地址和端口.在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应于不同的服务.Socket和ServerSocket类位于java.net包中.ServerSocket用于服务端,Socket是建立网络连接时使用的.连接成功时,应用程序两端都会产生一个Socket实例,通过操作这个实例完成所需会话. Socket常用方法: -int getLocalP

java 网络编程Socket编程

Server.java import java.io.*; import java.net.*; public class Server { public static void main(String args[]) { String [] answer ={"南非","进入世界杯了","哈哈...问题真逗!"}; ServerSocket serverForClient=null; Socket socketOnServer=null; Da