Java 简单网络编程

Java 网络编程

Socket(套接字)


前言:

套接字使用TCP提供了两台计算机之间的通信机制。客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket对象的写入和读取来进行通信。java.net.Socket类代表一个套接字,并且java.net.ServerSocket类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
  1. 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。

  2. 服务器调用 ServerSocket 类的 accept()方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。

  3. 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

  4. Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。

  5. 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

  6. 连接建立后,通过使用 I/O流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

    以上借鉴于菜鸟编程

C/S模式下,一个服务器对应多个客户端请求。客户端通过一个Socket对象绑定服务器的IP地址和端口号,并且通过Socket对象中getInputStream()方法和getOutputStream()与客户端进行读写。

代码1.0:

简单信息交互
客户端

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    public class C {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("127.0.0.1", 7777);
            /*创建套接字,并确定服务器的IP地址为127.0.0.1(本机地址)  端口号为7777*/
            
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            /*在套接字类中确定is输入流,os输出流*/
            
            os.write("hello server".getBytes());
            /*利用os对客户端输出一句话*/
            
            byte[] bt = new byte[1024];
            int len = is.read(bt);
            System.out.println(new String(bt,0,len));
            /*创建一个数组,并通过is把从服务器端获取的信息存入数组并输出*/
            
            socket.close();
            /*最后结束套接字连接*/
        }
    }

服务器端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class S {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(7777);
        /*创建服务器的套接字,并确定对外服务的端口号*/
        
        Socket accept = serverSocket.accept();
        /*侦听并接受到此套接字的连接,通过此方法与连接此服务器的客户端进行交互*/
        
        InputStream is = accept.getInputStream();
        OutputStream os = accept.getOutputStream();
        /*通过is,os进行交互,*/
        
        byte[] bt = new byte[1024];
        int len = is.read(bt);
        System.out.println(new String(bt,0,len));
        /*接受客户端发送的信息,并输出*/
        
        os.write("hello client".getBytes());
        /*对客户端进行输出*/
        
        accept.close();
        serverSocket.close();
        /*关闭套接字和服务端器*/
    }
}

代码2.0:

简单文件交互
客户端

import java.io.*;
import java.net.Socket;

public class CN {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\1.txt");
        /*创建文件输入流*/
        
        Socket socket = new Socket("127.0.0.1", 7777);
        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();
        /*与信息交互功能一致*/
        
        byte[] bt = new byte[1024];
        int len = 0;
        while ( (len = fis.read(bt)) != -1 ){
            os.write(bt,0,len);
        }
        /*创建一个数组,先通过文件输出流中的read方法,把需要传输给服务器的文档存入一个数组*/
        /*并通过套接字的方法把该字节部分输出给服务器*/
        
        socket.shutdownOutput();
        /*禁用此套接字的输出,把之前所有在流的信息push给服务器,并关闭输出流*/
        
        while ( (len = is.read(bt)) != -1){
            System.out.println(new String(bt,0,len));
        }
        /*通过is方法读取信息,并输入该信息*/
        
        fis.close();
        socket.close();
        /*关闭文件流和套接字*/
    }
}

服务器

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SN {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(7777);
        Socket accept = serverSocket.accept();
        
        InputStream is = accept.getInputStream();
        OutputStream os = accept.getOutputStream();
        
        int len = 0;
        byte[] bt = new byte[1024];
         /*与信息交互功能一致*/
         
        File file = new File("D:\\test");
        /*创建文件路径*/

        if ( !file.exists() ){
            file.mkdirs();
        }
        /*判断该文件路径是否存在,若不存在,创建该文件*/
        
        FileOutputStream fos = new FileOutputStream(file + "\\1.txt");
        /*创建文件输出路径*/
        
        while ((len = is.read(bt)) != -1){
            fos.write(bt,0,len);
        }
        /*通过该is把客户端获取的文件存入数组,并把该信息通过fos.write()方法写到本机文件*/
        
        os.write("Succeess".getBytes());
        /*回复客户端,文件传输成功*/
        
        fos.close();
        accept.close();
        serverSocket.close();
        /*关闭流和连接*/
    }
}

更新中…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值