java 网络流 TCP/UDP

一、ServerSocket

java.lang.Object

  |-java.net.ServerSocket

有子类SSLServerSocket。

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

常用构造方法:

ServerSocket(int port)  创建绑定到特定端口的服务器套接字

常用方法:

Socket accept()   侦听并接受到此套接字的连接

void bind( SocketAddress endpoint) 将ServerSocket绑定到特定地址(IP地址和端号)

void close() 关闭套接字

InetAddress  getInetAddress() 返回此服务器套接字的本地地址

int getLocalPort() 返回此套接字在其上侦听的端口

二、Socket

Java.lang.Object

         |-java.net.Socket

常用构造方法:

Socket(InetAddress address, int port)   创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

Socket(String host, int port)   创建一个流套接字并将其连接到指定主机上的指定端口号。

常用方法:

void  bind(SocketAddress bindpoint)   将套接字绑定到本地地址
void close() 关闭此套接字
void connect(SocketAddress endpoint)   将此套接字连接到服务器。 void  connect(SocketAddress endpoint, int timeout)   将此套接字连接到服务器,并指定一个超时值

InetAddress getInetAddress() 返回套接字连接的地址。
InputStream getInputStream()   返回此套接字的输入流。
OutputStream getOutputStream()  返回此套接字的输出流。
int getPort()  返回此套接字连接到的远程端口。
void shutdownInput()   此套接字的输入流置于“流的末尾”。
void shutdownOutput()     禁用此套接字的输出流。

三、DatagramSocket

Java.lang.Object

        |-java.net.DatagramSocket

常用构造方法:


DatagramSocket(int port) 
          创建数据报套接字并将其绑定到本地主机上的指定端口。


DatagramSocket(int port, InetAddress laddr) 
          创建数据报套接字,将其绑定到指定的本地地址。

常用方法:

应当注意的是,该类既能发送数据包也能接受数据包


void


bind(SocketAddress addr) 
          将此 DatagramSocket 绑定到特定的地址和端口。


void


close() 
          关闭此数据报套接字。


void


connect(InetAddress address, int port) 
          将套接字连接到此套接字的远程地址。


void


connect(SocketAddress addr) 
          将此套接字连接到远程套接字地址(IP 地址 + 端口号)。


InetAddress


getInetAddress() 
          
返回此套接字连接的地址。


void


receive(DatagramPacket p) 
          
从此套接字接收数据报包。


void


send(DatagramPacket p) 
          
从此套接字发送数据报包。

四、DatagramPacket

Java.lang.Object

|-java.net.DatagramPacket

常用构造方法:


构造方法摘要


DatagramPacket(byte[] buf, int length) 
          构造 DatagramPacket,用来接收长度为 length 的数据包。

 

DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

 

DatagramPacket(byte[] buf, int length, SocketAddress address) 
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

 

常用方法:


InetAddress


getAddress() 
          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。


int


getPort() 
          
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。


void


setAddress(InetAddress iaddr) 
          
设置要将此数据报发往的那台机器的 IP 地址。


void


setData(byte[] buf, int offset, int length)


void


setPort(int iport) 
          
设置要将此数据报发往的远程主机上的端口号。


void


setSocketAddress(SocketAddress address) 
          
设置要将此数据报发往的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。

五、简单TCP应用实例:

一 服务端小写转大写服务

服务端程序:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 这是服务端程序
 * @author kuangdaoyizhimei
 *
 */
public class Server
{
    public static void main(String args[]) throws IOException
    {
        ServerSocket ss=new ServerSocket(7894);
        Socket s=ss.accept();
        System.out.println(s.getInetAddress().getHostAddress()+"已连接。");
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
        String str=null;
        while((str=br.readLine())!=null)
        {
            System.out.println(str);
            pw.println(str.toUpperCase());//注意println方法的使用在这里是必须的,否则会产生死锁
        }
        s.close();
        ss.close();
    }
}

客户端程序:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 这是客户端程序。
 * @author kuangdaoyizhimei
 *
 */
public class Client
{
    public static void main(String args[]) throws UnknownHostException, IOException
    {
        Socket s=new Socket("192.168.1.101",7894);
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedReader bin=new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
        String str=null;
        while((str=br.readLine())!=null)
        {
            pw.println(str);
            String result=bin.readLine();
            System.out.println(result);//注意println方法的使用在这里是必须的,否则会产生死锁
        }
        s.close();
    }
}

运行结果:

服务端运行结果:

客户端运行结果:

二、简单UDP服务演示:局域网群聊小程序

程序使用的广播地址是192.168.1.255,每个客户端的接收端口是6544。

程序中使用了多线程技术。

package p01.UDPTransferDemo.p01.UDPTransferDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
 * 接收线程ReceiveThread
 * @author kuangdaoyizhimei
 */
class ReceiveThread implements Runnable
{
    DatagramSocket ds=null;
    public ReceiveThread(DatagramSocket ds)
    {
        this.ds=ds;
    }
    @Override
    public void run()
    {
        while(true)
        {
            try
            {
                byte buf[]=new byte[1024];
                //2.创建接收数据报
                DatagramPacket dp=new DatagramPacket(buf, buf.length);
                ds.receive(dp);
                //3.显示数据报信息
                System.out.println(dp.getAddress().getHostAddress()+":"+dp.getPort()+":"+new String(dp.getData(),0,dp.getLength()));
            }
            catch(IOException e)
            {
                System.out.println("接受线程产生异常!");
            }
        }
    }
}
/**
 * 发送线程SendThread
 * @author kuangdaoyizhimei
 *
 */
class SendThread implements Runnable
{
    DatagramSocket ds=null;
    public SendThread(DatagramSocket ds)
    {
        this.ds=ds;
    }
    @Override
    public void run()
    {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str=null;
        try {
                    while((str=br.readLine())!=null)
                    {
                        try
                        {
                            //2.创建发送数据包。
                            DatagramPacket dp=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.1.255"),6544);
                            //3.发送数据包
                            ds.send(dp);
                        }
                        catch(IOException e)
                        {
                            System.out.println("发送线程产生异常!");
                        }
                    }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/**
 * 主类UDPTransferDemo
 * @author kuangdaoyizhimei
 *
 */
public class UDPTransferDemo {
    public static void main(String args[]) throws IOException
    {
        DatagramSocket Send=new DatagramSocket();
        DatagramSocket Receive=new DatagramSocket(6544);
        new Thread(new ReceiveThread(Receive)).start();
        new Thread(new SendThread(Send)).start();
    }
}

三、TCP应用之文本文件上传

  在和源文件同一个文件夹中预先准备一个文本文件aim.txt,里面内容自定义。

服务端程序:

package p04.TCPUpperLoadFileDemo.p01.TCPUpperLoadTextFileDemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPUpperLoadServer {
    public static void main(String args[]) throws IOException
    {
        ServerSocket ss=new ServerSocket(9876);
        Socket s=ss.accept();
        InputStream is=s.getInputStream();
        BufferedReader brIn=new BufferedReader(new InputStreamReader(is));
        OutputStream os=s.getOutputStream();
        BufferedWriter bwOut=new BufferedWriter(new OutputStreamWriter(os));
        String str=null;
        File file=new File("副本.txt");
        BufferedWriter bw=new BufferedWriter(new FileWriter(file));
        while((str=brIn.readLine())!=null)
        {
            System.out.println(str);
            bw.write(str);
            bw.newLine();//此处换行是为了写到文件的换行
            bw.flush();
        }
        bw.close();
        bwOut.write("上传成功!");
        bwOut.flush();
        s.close();
    }
}

客户端程序:

package p04.TCPUpperLoadFileDemo.p01.TCPUpperLoadTextFileDemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPUpperLoadClient {

    public static void main(String[] args) throws UnknownHostException, IOException
    {
        Socket socket=new Socket("192.168.209.1",9876);
        InputStream is=socket.getInputStream();
        BufferedReader brIn=new BufferedReader(new InputStreamReader(is));
        OutputStream os=socket.getOutputStream();
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
        File file=new File("aim.txt");
        FileReader fr=new FileReader(file);
        BufferedReader br=new BufferedReader(fr);
        String str=null;
        while((str=br.readLine())!=null)
        {
            bw.write(str);
            bw.newLine();//此处换行是为了给服务器端读取一行的结束标记。
            bw.flush();
        }
        socket.shutdownOutput();//没有这一句话两端将都处于等待状态。
        br.close();
        str=brIn.readLine();
        System.out.println(str);
    }
}

运行结果:

四、TCP应用之媒体文件上传

准备:aim.mp4文件,放在和源代码文件同一个目录下

客户端:

package p04.TCPUpperLoadFileDemo.p02.TCPUpperLoadMultipleFileDemo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPUpperLoadMultipleFileClient {

    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket=new Socket("192.168.209.1",9876);
        InputStream is=socket.getInputStream();
        OutputStream os=socket.getOutputStream();
        byte buf[]=new byte[1024];
        File file=new File("aim.mp4");
        FileInputStream fis=new FileInputStream(file);
        int length=0;
        while((length=fis.read(buf))!=-1)
        {
            os.write(buf, 0, length);
            os.flush();
        }
        fis.close();
        socket.shutdownOutput();

        /**
         * 显示上传状态信息
         */
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        String str=br.readLine();
        System.out.println(str);
        socket.close();
    }

}

服务端:

package p04.TCPUpperLoadFileDemo.p02.TCPUpperLoadMultipleFileDemo;

import java.io.File;
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 TCPUpperLoadMultipleFileServer {

    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(9876);
        Socket socket=ss.accept();
        InputStream is=socket.getInputStream();
        OutputStream os=socket.getOutputStream();
        FileOutputStream fos=new FileOutputStream(new File("副本.mp4"));
        byte buf[]=new byte[1024];
        int length=-1;
        while((length=is.read(buf))!=-1)
        {
            fos.write(buf, 0, length);
            fos.flush();
        }
        fos.close();
        os.write("文件上传成功!".getBytes());
        socket.close();
        ss.close();//服务器一般不关闭,这里只是用于演示,所以关闭。
    }
}

运行结果:

五、TCP应用之QQ群聊

客户端之输入端:

/**
 * 此程序模拟QQ输入
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPTransferQQImitateClient {

    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("这是用户信息输入窗口:");
        Socket socket=new Socket("192.168.209.1",8080);
        OutputStream os=socket.getOutputStream();
        PrintWriter pw=new PrintWriter(os,true);
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str=null;
        while((str=br.readLine())!=null)
        {
            if(str.equals("over"))
            {
                break;
            }
            pw.println(str);
        }
        br.close();
        pw.close();
        socket.shutdownOutput();
        socket.close();
    }
}

客户端之接收端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 此程序模拟群聊输出
 * @author kuangdaoyizhimei
 *
 */
public class ReceiveInformationClient {

    public static void main(String[] args) throws IOException {
        System.out.println("这是群聊显示窗口:");
        ServerSocket ss=new ServerSocket(8000);
        while(true)
        {
            Socket s=ss.accept();
            InputStream is=s.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String str=null;
            str=br.readLine();
            System.out.println(str);
        }
    }
}

服务端之用户接入端:

/**
 * 此程序模拟服务器处理用户接入
 */
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.HashSet;

public class TransmitServer {
    public static void main(String[] args) throws IOException {
        System.out.println("这是服务器处理多线程窗口:");
        ServerSocket ss=new ServerSocket(8080);
        HashSet<String>hs=new HashSet<String>();
        while(true)
        {
            Socket socket=ss.accept();
            System.out.println("用户"+socket.getInetAddress().getHostName()+"接入!");
            Thread thread=new Thread(new ClientHandle(socket,hs));
            thread.start();
        }
    }
}

服务端之转发端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.HashSet;
/**
 * 此程序模拟服务器处理单个用户的线程接入和数据转发。
 * @author kuangdaoyizhimei
 *
 */
public class ClientHandle implements Runnable {
    private Socket socket;
    private HashSet<String>list;
    public ClientHandle(Socket socket, HashSet<String> list) {
        this.socket=socket;
        this.list=list;
    }

    @Override
    public void run() {
        System.out.println("这是服务器处理单线程窗口:(核心窗口)");
        try
        {
                list.add(socket.getInetAddress().getHostAddress());
                InputStream is=socket.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
                String ip=socket.getInetAddress().getHostAddress();
                int port=socket.getPort();
                String str=ip+":"+port+" :";
                String temp=null;
                while((temp=br.readLine())!=null)
                {
                    for(String s:list)
                    {
                        Socket sk=new Socket(s,8000);
                        OutputStream osm=sk.getOutputStream();
                        PrintWriter pw=new PrintWriter(osm,true);
                        pw.println(str+temp);
                        sk.close();
                    }
                }
        }
        catch(IOException e)
        {
            System.out.println("用户"+socket.getInetAddress().getHostAddress()+"退出!");
        }
    }
}

运行结果:

时间: 2024-10-21 14:13:21

java 网络流 TCP/UDP的相关文章

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列表里面选择了用户后,可以与此用户建立点对点链接进行聊天,可以发送文件. 用户在线离线状态会实时更新,如果离线,则存为离线消息.当下次上线的时候,会接受到离线消息 从一个用户接受文件的同时,还可以接受从服务器发过来的文件 接受文件完成后,显示记录,并显示保存目录 消息发送演示 服务器端代码: 1 im

Java中的TCP/UDP网络通信编程

127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口. 网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议. Socket连接套接字,

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

JAVA中TCP和UDP传输例子的对比

在本文中我将学到的java中的UDP和TCP在局域网内的传输做了对比,这里强调 的是局域网范围内,非广域网.首先,下面的是我写的在局域网内利用java中的UDP协议写的一个传输文件或者图片的类. --------------------------------------------------------------------------------------------------------------------------------------------------------

[Java] Tcp/udp 简单通信

本文转自  我自己的博客guozeyiblog.cn 欢迎来访 效果图: //UDP通信 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.*; import javax.swing.*; class send extends JFrame implements ActionL

Java 网络编程(二) 两类传输协议:TCP UDP

两类传输协议:TCP,UDP TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议. 在TCP/IP协议中, IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一确定Internet上的一台主机. 而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 通过TCP协议传输,得到的是一个顺序的无差错的数据流. 发送方和接收方的成对的两个socket之间

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

网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. HTTP协议和Socket的区别 http协议是应用层,其模式是请求-应答,客户端发送请求,服务器端进行响应.传输的数据是原始格式的数据,eg :json.xml.text等数据格式. socket不是协议是接口,socket提供TCP/UDP socket 的实例,供java 或者其他语言操作数

4.Java网络编程之TCP/UDP

常见传输协议: UDP , TCP UDP协议:    特点:         1.将数据及源和目的封装成数据包中,不需要建立连接         2.每个数据包的大小限制在64K内         3.因无连接,是不可靠协议         4.不需要建立连接,速度快 举例:比如你向家里邮寄一个包裹,无论家里此时是否有人,都会发送.当快递员发送到你家时,如果有人,家里人就收到了包裹,如果家里此时没有人,包裹(数据包)就被丢弃了. 自我理解: 当我们建立连接后,你说了一句:"你吃过饭了么?&qu

TCP/UDP网络连接的固定写法

java.net包中定义的两个类Socket(client) ServerSocket(server)建立连接时所需寻址信息为远程计算机的IP地址和端口号(自己指定端口号>1024,小于1024的可能被系统征用)TCP,UDP端口哥含65536个 TCP: Server端与Cilent端同时写,启动时必须先启动Server端 import java.net.*; public class TCPServer{ public static void main(String [] args) thr