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