Java中socket基础知识以及代码的展示应用

  • 了解socket使用
项目目标:

实现本地的客户端与服务器一问一答.

Socket

1 .IP
1.1什么是IP?

IP是根据TCP/IP协议划定,由32位二进制数组成,而且在因特网上是唯一的数值

例如:某台计算机,连上网的IP是:

11010101 01001001 11110000 11001100

为了便于记忆,会将这32位二进制数,每8位一组,每段之间用小数点分割

11010101.01001001.11110000.11001100

再将每八位转化为十进制

213.73.240.204

1.2 如何查看自己电脑的ip?
  1. 按win+R, 输入cmd,打开dos窗口

  2. 在dos窗口输入ipconfig

1.2 什么是端口号

  • 端口号(port number)就是计算机为了给每个网络程序分配一个独一无二的区别符,有了这些端口号,就可以准确定位到具体的程序。
  • 端口号是个整数,范围0-65535,就是当开启一个程序时,计算机就分配给应用程序一个端口.
Socket概述

在计算机领域中,Socket也被称为套接字编程,它是计算机之间进行通信的一种约定或者说是一种方式。

应用程序可以通过它发送或者接收数据,可以对其发送过来的内容像处理文件一样,打开、关闭或者读写等操作,套接字允许应用程序将I/O插入到互联网上,并与网络中的其他程序进行通信。

Socket常用方法
服务器端ServerSocket

在服务器端选择一个端口号,然后在指定的端口号上等待客户端发起的连接

构造方法:

ServerSocket(int port) 创建一个绑定特定端口号的服务器套接字
accept() 侦听并接受到发送到此套接字的连接
close() 关闭此套接字
客户端Socket

构造方法:

Socket(String host,int port) 创建一个套接字,并且连接到host,并且绑定端口号
getInputStream() 返回此套接字的输入流
getOutputStram() 返回此套接字的输出流
close() 关闭此套接字
项目步骤
分别在socket包下新建两个类:
Server
/**
 * 服务器
 */
public class Server {
    /** 
	 * java.net.ServerSocket 
	 * ServerSocket 是运行在服务端的,它的主要工作: 
	 * 1:打开服务端口(客户端就是通过这个端口与服务端建立链接) 
	 * 2:监听该服务端口,一旦一个客户端链接,则会返回一个 Socket 实例,并通过这个 Socket 实例与链接的	      *   客户端进行交互  
 	 * 如果我们将 Socket 比喻为"电话",那么 ServerSocket 相当于是"总机"。 
     */
    ServerSocket serverSocket;
    public Server() {
        try {
            /**
            *如果端口被占用则会报异常:
             * java.net.BindException:address already in use
             * 解决办法:
             *        更换端口号,直到运行成功为止.
             */
            */
            serverSocket = new ServerSocket(8088);//设置服务器端口号
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {
        try {
            System.out.println("等待客户端链接");
            /**ServerSocket提供的重要方法
            *  Socket accept()
            *  该方法用户接受客户端的链接,并返回一个Socket实例与连接的客户端交互
            *  该方法是一个阻塞方法,调用后程序会卡住,直到一个客户端链接为止.
            */
            Socket socket = serverSocket.accept();
            System.out.println("客户端已链接");
            InputStream input = socket.getInputStream();//获取输入流,接收客服端消息
            byte[] bytes = new byte[1024*10];//字节数组,用来将接收的消息进行存储
            int d = input.read(bytes);//目前发送的消息很少,不用循环读取,直接读取到bytes数组中
            String s = new String(bytes,0,d);//将读来的字节数组中的内容转换为String打印
            System.out.println(s);//打印
            OutputStream output = serverSocket.getOutputStream();//获取输出流
            output.write("服务器发:你好客服端!".getBytes("utf8"));//响应给客户端一句话
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Server().start();
    }
}
Client
package socket1;

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

/**
 * 客户端
 */
public class Client {
     /** 
 	* java.net.Socket 套接字,原意是插座 
 	* Socket 封装了 TCP 协议的通讯细节,我们使用他可以与远端计算机建立 TCP 链接。
	* 并基于一堆流的 IO 操作完成与远端计算机的数据交换。 
	 我们可以将Socket比喻为"电话"
 	*/ 
    Socket socket;
    public Client() {
        try {
 			/** 
 			* 实例化Socket时就是与远端计算机建立连接的过程
 			* 这里需要传入两个参数:
			* 1.服务器的ip地址,用于找到网络上对方的计算机 
			  2.服务器端口,用于找到服务端计算机上的服务器应用程序
 			*/ 
            System.out.println("正在连接服务器");
            socket = new Socket("localhost", 8088);//1.ip地址  2.端口号
            System.out.println("已连接服务器");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {
        try {
            OutputStream output = socket.getOutputStream();//获取输出流,通过流发给服务器消息
            String message = "客户端发:服务器你好!";//消息内容
            output.write(message.getBytes("utf8"));//将消息内容转换为字节数组写出
            InputStream input = socket.getInputStream();//获取输入流,准备接收服务器返回的消息
            byte[] bytes = new byte[1024 * 10];
            int d = input.read(bytes);//将接受的消息存储给字节数组
            String s = new String(bytes, 0, d);//将字节数组的内容转换为String
            System.out.println(s);//打印

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Client().start();
    }
}

上篇文章:入门Java编程的知识点—>Map(day18)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/141554619下篇文章: 入门Java编程的知识点—>Http协议(day20)-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/Z0412_J0103/article/details/141590909

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值