socket的简单运用01---上传下载文件

pc机的远程主机程序

send.java

import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
* filename : send.java
* company : **** Limited (android) 2012-2015
* compiler : eclipse 3.7.1
* remark : TODO
* created : 2012-3-5 weeds
* changed : 后来者居下
*/

/**
* filename : TODO
*/
public class send {

/**
*
@param args
*/
static File fname;
static int port=8888;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
readFile("d.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void SendFile(String fileName)
{
fname=new File(fileName);
try {
fname.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void readFile(String fileName) throws IOException
{
Socket cs=null;
try{
System.out.println("正在等待连接...");
ServerSocket ss=new ServerSocket(port);
while(true){
String filePath="D:\\yc.rar";
File fi=new File(filePath);
System.out.println("文件长度是:"+(int)fi.length());
cs=ss.accept();
System.out.println("建立socket链接");
DataInputStream dis=new DataInputStream(new BufferedInputStream(cs.getInputStream()));
dis.readByte();
DataInputStream fdata=new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps=new DataOutputStream(cs.getOutputStream());
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long)fi.length());
ps.flush();
byte[] b=new byte[102400];
while(true){
int read=0;
if(fdata!=null){
read=fdata.read(b);

}
if(read==-1){
return ;
}
ps.write(b, 0, read);
ps.flush();
fdata.close();

dis.close();
cs.close();
ss.close();
}
}

}catch (Exception e) {
// TODO: handle exception

}
}






}

 

转载于:https://www.cnblogs.com/weeds/archive/2012/02/10/2344849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 分别运用Runnable和Callable接口实现线程: Runnable接口是Java中定义线程的标准方式,它只有一个run()方法,线程执行的代码就在这个方法里。Callable接口也是Java中定义线程的一种方式,它也只有一个call()方法,与run()方法不同的是,call()方法可以返回一个结果。 使用Runnable接口实现线程: ``` public class MyRunnable implements Runnable { public void run() { // 线程执行的代码 } } // 创建线程并启动 MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); ``` 使用Callable接口实现线程: ``` public class MyCallable implements Callable<Integer> { public Integer call() throws Exception { // 线程执行的代码 return 123; } } // 创建线程并启动 MyCallable myCallable = new MyCallable(); FutureTask<Integer> futureTask = new FutureTask<>(myCallable); Thread thread = new Thread(futureTask); thread.start(); // 获取线程执行结果 int result = futureTask.get(); ``` 2. 分别运用同步代码段、同步方法和同步锁的方法实现线程同步: 同步代码段: ``` public class MyRunnable implements Runnable { private int count = 0; private Object lock = new Object(); public void run() { synchronized (lock) { for (int i = 0; i < 10000; i++) { count++; } } } } ``` 同步方法: ``` public class MyRunnable implements Runnable { private int count = 0; public synchronized void run() { for (int i = 0; i < 10000; i++) { count++; } } } ``` 同步锁: ``` public class MyRunnable implements Runnable { private int count = 0; private Lock lock = new ReentrantLock(); public void run() { lock.lock(); try { for (int i = 0; i < 10000; i++) { count++; } } finally { lock.unlock(); } } } ``` 3. 实验UDP协议实现用户信息的发送和接受功能: UDP是一种无连接的传输协议,它不需要建立连接就可以发送数据包。UDP协议使用的是面向无连接的通信模式,它不保证数据传输的可靠性。在Java中,使用DatagramSocket和DatagramPacket类来实现UDP协议的数据发送和接收。 发送端代码: ``` public class UDPSender { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(); String message = "Hello, UDP!"; byte[] data = message.getBytes(); InetAddress address = InetAddress.getByName("127.0.0.1"); DatagramPacket packet = new DatagramPacket(data, data.length, address, 8888); socket.send(packet); socket.close(); } } ``` 接收端代码: ``` public class UDPReceiver { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(8888); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("Received message: " + message); socket.close(); } } ``` 4. 运用TCP协议实现向服务器上传文件: TCP是一种可靠的面向连接的传输协议,它使用三次握手建立连接,保证数据的可靠传输。在Java中,使用Socket和ServerSocket类来实现TCP协议的数据传输。 客户端代码: ``` public class TCPClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1", 8888); OutputStream outputStream = socket.getOutputStream(); FileInputStream fileInputStream = new FileInputStream("test.txt"); byte[] buffer = new byte[1024]; int len = 0; while ((len = fileInputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } fileInputStream.close(); socket.shutdownOutput(); InputStream inputStream = socket.getInputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); while ((len = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, len); } String result = new String(byteArrayOutputStream.toByteArray()); System.out.println(result); byteArrayOutputStream.close(); inputStream.close(); outputStream.close(); socket.close(); } } ``` 服务端代码: ``` public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream("test_copy.txt"); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, len); } fileOutputStream.close(); OutputStream outputStream = socket.getOutputStream(); outputStream.write("Upload success".getBytes()); outputStream.close(); inputStream.close(); socket.close(); serverSocket.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值