1.什么是socket
简单解释就是:socket就是端口号与网络地址的组合。以下就是socket的应用:客户端给服务器端传递一张图片,服务器端接受图片并且反馈“收到”信息,客户端接受反馈信息。
2.代码(客户端)
@Test
public void Client() throws IOException {
//1.InetAddress表示一个ip地址对象,类似于new File("path")
//这里的 getLocalHost()表示获取本机的IP地址对象
InetAddress inetAddress = InetAddress.getLocalHost();
//Socet套接字有一个有参的构造方法就是传入ip地址对象和服务器的端口号
Socket socket = new Socket(inetAddress,8532);
//这里的path的相对路径是src下的相对路径
//或者绝对路径
File f = new File("path");
//获得file文件的节点流
FileInputStream fis = new FileInputStream(f);
//获得输出流,通过fis读取的文件写入outputStream中,然后socket会将
// 写进去的数据发送给服务器端。
OutputStream outputStream = socket.getOutputStream();
byte[] buff = new byte[10];
int len;
while((len = fis.read(buff)) != -1){
outputStream.write(buff,0,len);
}
//该方法作用,让客户端的socket的outputStream流关闭,但是不会断开和服务器端的连接
//通俗来说就是 ,该方法通知服务器:"我的数据发送结束了,你还有什么事要交代的吗"?
//如果没有该方法,服务器就不知道客户端是否发送数据结束。从而一直出现等待状态。
//进而服务器端不会执行InputStream is = accept.getInputStream();之后的代码,因为它一直等待
//继续获取
//该方法结束后就看服务器端的代码了
socket.shutdownOutput();
//--------------------------------------------------------------------------------------------
//获得服务器端反馈的数据
InputStream inputStream = socket.getInputStream();
//将服务器传过来的字节流转换成字符流
InputStreamReader isr = new InputStreamReader(inputStream);
int buf;
//输出字符流(即得到服务器端反馈过来的数据)
while(( buf= isr.read())!= -1){
System.out.print((char) buf);
}
//以下的流关闭不做解释(这里省略了try-catch)
isr.close();
inputStream.close();
outputStream.close();
fis.close();
socket.close();
}
3.代码(服务器端)
@Test
public void Server() throws IOException {
//构造一个服务器端的socket,注意这里是serverSocket
//不是socket ,这个对象只需要指定服务器自己的端口号
ServerSocket socket = new ServerSocket(8532);
//new文件对象
File file = new File("src\\...");
//通过accept()获得socket对象
Socket accept = socket.accept();
//获得文件输出流,指定从客户端接收的文件的存储位置
FileOutputStream fos = new FileOutputStream(file);
//通过socket获得InputStream对象,获得客户端发送过来的数据
InputStream is = accept.getInputStream();
//将客户端发送过来的数据写入fos对象指定的位置
byte[] buff = new byte[10];
int len;
while((len = is.read(buff)) != -1){
fos.write(buff,0,len);
}
//与客户端同理
accept.shutdownInput();
//服务器端反馈
OutputStream os1 = accept.getOutputStream();
os1.write("发送成功!".getBytes());
//以下的流关闭不做解释(这里省略了try-catch)
os1.close();
is.close();
fos.close();
accept.close();
socket.close();
}