发布网友 发布时间:2022-05-11 09:53
共3个回答
热心网友 时间:2023-01-27 09:01
其实这个问题你应该先想一下socket到底是一个什么东西,在网络编程中socket到底用来做什么的。socket:在操作系统内核中它代表网络连接的一个端点(endpoint),在应用程序中它代表一个打开的文件。socket pair唯一确定的一条网络连接,socket pair就是客户端socket和服务端socket的一个组合。也就是客户端ip和port与服务端ip和port的组合。一条网络连接也就是一条通信的信道,tcp连接代表的信道是全双工的。以信道来讲,逻辑上就存在两个管道来代表输出与输入来发送和接收信息。
那么在应用程序上我们就可以拿到这2个管道来完成socket之间的通信。
以你的应用来看输出流fos就代表着图中的红色管道,那么在服务端就应该是这个样的。
Scoket connSock = serverSocket.accept();//connSock代表着服务端的Socket
InputStream is = connSock.getInputStream();//输入流is代表图中的红色管道
OutputStrea os = connSock.getOutputStream();//输出流os代表图中的绿色管道
在服务端有一个字节缓冲区来存放从is读取的字节数据
byte[] buffer = new byte[1024];
然后服务端读取数据来填充这个字节缓冲区
is.read(buffer);//比如这样
然后就根据你的需求来操作这个buffer了。
然后把处理过后的数据通过os发送给客户端。os就是图中的那个绿色管道
os.write(处理过后的数据);
热心网友 时间:2023-01-27 10:19
楼上正解追问楼上正解?看清我的问题没有哦,我是要传输文件刘,如果是一个buffer或者一个字节的传我还用问么,如果没有答案直接给个不能实现就可以了,崩溃。
热心网友 时间:2023-01-27 11:54
package cn.hncu.tcp.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadPicClient {
public static void main(String[] args) {
if(args.length!=1){
System.out.println("请指定文件");
return;
}
File file=new File(args[0]);
if(!(file.exists() && file.isFile())){
System.out.println("上传的文件不存在");
}
if(!(file.getName().endsWith(".jpg")|| file.getName().endsWith(".gif"))){
System.out.println("文件格式有误");
return;
}
if(file.length()>=1024*1024*2){
System.out.println("文件过大");
return;
}
//上传
try {
Socket s=new Socket("127.0.0.1",10008);
FileInputStream fin=new FileInputStream(file);
OutputStream out=s.getOutputStream();
byte[] buf=new byte[1024];
while((fin.read(buf))!=-1){
out.write(buf, 0, buf.length);
}
s.shutdownOutput();//解决阻塞问题
byte[] b=new byte[1024];
s.getInputStream().read(b);
System.out.println(new String(b));
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//服务器端
[java] view plain copy
package cn.hncu.tcp.upload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadPicServer {
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(10008);
while(true){//多线程实现多用户并发访问
Socket s=server.accept();
new Thread(new UploadThread(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class UploadThread implements Runnable{
private Socket s;
public UploadThread(Socket s) {
this.s=s;
}
@Override
public void run() {
try {
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"connected....");
InputStream in=s.getInputStream();
File dir=new File("f:\\mypic");
if(!dir.exists()){
dir.mkdir();
}
//下面这段主要是把同一个Ip地址的客户端发来的照片用127.0.0.1.jpg格式和127.0.0.1(1)区分开来。
int count=0;
File file=new File(dir,ip+".jpg");
while(file.exists()){//第二次如果存在,则在后面加(1)(2)等。
file=new File(dir,ip+"("+(count++)+")"+".jpg");
}
//从客户端读取
FileOutputStream fout=new FileOutputStream(file);
byte[] buf=new byte[1024];
int len=in.read(buf);
while((len=in.read(buf))!=-1){
fout.write(buf, 0, len);
}
//给客户端上传成功的提示
OutputStream out=s.getOutputStream();
out.write("上传成功".getBytes());
fout.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}