socket协议的java实现(附加代码)

Java如何使客户端和服务器进行通信?

Java是通过socket来实现的.

 

那么什么是socket?

打个比方现在有A和B两个相隔很远的城市。那么如何从A到b城市呢?很简单当然就是乘坐交通工具。所以交通工具就是一个起着沟通AB城市的纽带。而在网络中AB就是客户端和服务器,交通工具就是socket。

 

还有一个点不要思维定视。服务器和客户端是相对而言的。就好比上面的ab两座城市,如果你从a到b城市,那么你的发出地是A,目的地是B,那么你从b到A,这出发地和目标的不久变化了吗。同理在网络中的客户端和服务器也是一样的。

 

 

那么socket是如何通信的。

我觉得在网络如何通信其实就两步骤。第一步:建立连接。第二步:数据传输

 

那么如何建立连接呢?

 

很简单,因为每个电脑都有自己的ip地址,这个ip地址就是你计算机在网上的身份证,身份证是独一无二的。所以我只要得到你的ip地址,那么就建立了和你计算机连接。但是大家想过这个问题没有。你和对方进行QQ聊天,你能找到对方的ip地址,但是我说过找到ip只是建立两个计算机的连接。凭什么QQ就只能和QQ聊天。QQ发的东西就不会被YY接收呢?这个其实也很简单。因为每个应该用程序都有自己的端口号。端口号?什么是端口号?就是port,这个就像应用程序的身份证。我说几个端口把。如3306这个端口就是MYSAL数据的端口,还有8080是tomcat的端口号。当然QQ也有自己的端口号,大家想如果我在建立连接的时候,先确定ip,在确定端口,我不就可以锁定一个计算机的特定程序了吗?这就是计算机的连接。

我给大家看看在java中是如何创建一个socket对象的。

Socket socket = new Socket("192.168.1.1", 9876);看到了木有前面是ip后面是端口。

 

 

那么如何进行数据交流的?

很简单,java是怎么对数据进行读和写的?当然是I/O。所以在数据传输的时候就是我们对I/O流的操作。所以在搞javaweb的时候,对I/O的处理永远是难点。这个说的比较简单。因为这部分是I/O的知识。我更想用代码去说。

 

下面我写一段java代码吧。这段代码是能在两个计算机上面能进行通信的。

首先写服务器的。

public class Server {

    public static void main(String[] args) {

       try {

           ServerSocket serverSocket = new ServerSocket(9876);

           Socket socket = serverSocket.accept();

           OutputStream outputStream = socket.getOutputStream();

           outputStream.write(25);

 

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

 

ServerSocket这个就说明是服务器端的。大家想服务器是干嘛用的?供大家访问数据的用的。创建对象ServerSocket serverSocket = new ServerSocket(9876);    你说他是被访问的,所以我只要写一个端口的9876就行了吧。他是不需要别人的IP的。但是他要给别人提供服务把所以要沟通把,得有socket工具吧?

Socket socket =serverSocket.accept();

这个创建也比较有意思。他要做的只要说我把这个服务器打开就行了。所以accept()英文不就是接收同意的的意思吗。到了这里。其实客户端只要知道他的Ip地址和端口就可以和他建立连接了。

建立连接了不行啊。我得传送数据啊。这里我就写一个输入流。OutputStream outputStream = socket.getOutputStream();这样输入流被建立,接着我得写数据啊,outputStream.write(25);

我就写了一个25数字当作我发送的内容。这样一个关于客服务器段的代码就OK了。

 

 

接着我写一个客户端的:

public class Client {

    public static void main(String[] args) {

       try {

           Socket socket = new Socket("192.168.1.1", 9876);

           InputStream in = socket.getInputStream();

           System.out.println(in.read());

           in.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

      

    }

 

}

 

 

建立一个socket通信把。Socket socket = new Socket("192.168.1.1", 9876);

我是客户端就得访问别人的服务器,这个192。168.1.1是对方的ip地址,如果你知道别人的IP也是可以的,当然你们得在一个互联网里。9876不是前面那个服务器的端口吗。一但这个socket对象建立了那么我们就已经建立连接了。然后我建立一个输出流来读来自服务器的数据   InputStream in =socket.getInputStream();通过下面的代码我们就可以读到服务器传送的25数据了。

System.out.println(in.read());

怎么样socket简单吧?

 

当然我这里说的只有客户端接收部分和服务器发送部分,还有客户端发送和服务器接收没有写,但是这两个就是对I/O的操作。当然IO要难是很难的。我上面只是为了说清楚socket的原理而已。

 

 

上面的是传数字的,下面来一个发送字符串的。

客户端:

package com.fish;

 

import java.io.InputStream;

import java.net.Socket;

 

public class Cilent {

    public static void main(String[] args) {

       try {

           Socket socket = new Socket("192.168.1.1", 2233);

           InputStream in = socket.getInputStream();

           byte message = (byte) in.read();

           while (message != -1) {

              System.out.print((char) message);

              message = (byte) in.read();

           }

           in.close();

       } catch (Exception e) {

           // TODO: handleexception

       }

    }

}

 

服务器

package com.fish;

 

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

 

 

public class Server {

    public static void main(String[] args) {

       try {

           ServerSocket serverSocket = new ServerSocket(2233);

           Socket socket = serverSocket.accept();

           OutputStream outputStream = socket.getOutputStream();

           String message = "hellofish!";

           outputStream.write(message.getBytes());

           outputStream.close();

          

       } catch (Exception e) {

           // TODO: handle exception

       }

    }

}

 

 

这样我们在客户端可以收到hello fish

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值