服务器(Server)
[java] view plaincopy
package com.socket.sample;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
int port = 8821;
void start() {
Socket s = null;
try {
ServerSocket ss = new ServerSocket(port);
while (true) {
// 选择进行传输的文件
String filePath = "D:\\lib.rar";
File fi = new File(filePath);
System.out.println("文件长度:" + (int) fi.length());
// public Socket accept() throws
// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
s = ss.accept();
System.out.println("建立socket链接");
DataInputStream dis = new DataInputStream(
new BufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStream fis = new DataInputStream(
new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(s.getOutputStream());
// 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java
// 4th里有现成的代码。
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
while (true) {
int read = 0;
if (fis != null) {
read = fis.read(buf);
// 从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b
// 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾 (end of file)
// 或抛出异常之前,此方法将一直阻塞。
}
if (read == -1) {
break;
}
ps.write(buf, 0, read);
}
ps.flush();
// 注意关闭socket链接哦,不然客户端会等待server的数据过来,
// 直到socket超时,导致数据不完整。
fis.close();
s.close();
System.out.println("文件传输完成");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
new ServerTest().start();
}
}
客户端工具(SocketTool)
[java] view plaincopy
package com.socket.sample;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
public class ClientSocket {
private String ip;
private int port;
private Socket socket = null;
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, int port) {
this.ip = ip;
this.port = port;
}
/** */
/**
* 创建socket连接
*
* @throws Exception
* exception
*/
public void CreateConnection() throws Exception {
try {
socket = new Socket(ip, port);
} catch (Exception e) {
e.printStackTrace();
if (socket != null)
socket.close();
throw e;
} finally {
}
}
public void sendMessage(String sendMessage) throws Exception {
try {
out = new DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
return;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
return;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} else {
out.writeUTF(sendMessage);
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
if (out != null)
out.close();
throw e;
} finally {
}
}
public DataInputStream getMessageStream() throws Exception {
try {
getMessageStream = new DataInputStream(new BufferedInputStream(
socket.getInputStream()));
return getMessageStream;
} catch (Exception e) {
e.printStackTrace();
if (getMessageStream != null)
getMessageStream.close();
throw e;
} finally {
}
}
public void shutDownConnection() {
try {
if (out != null)
out.close();
if (getMessageStream != null)
getMessageStream.close();
if (socket != null)
socket.close();
} catch (Exception e) {
}
}
}
客户端(Client)
[java] view plaincopy
package com.socket.sample;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class ClientTest {
private ClientSocket cs = null;
private String ip = "localhost";// 设置成服务器IP
private int port = 8821;
private String sendMessage = "Windows";
public ClientTest() {
try {
if (createConnection()) {
sendMessage();
getMessage();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private boolean createConnection() {
cs = new ClientSocket(ip, port);
try {
cs.CreateConnection();
System.out.print("连接服务器成功!" + "\n");
return true;
} catch (Exception e) {
System.out.print("连接服务器失败!" + "\n");
return false;
}
}
private void sendMessage() {
if (cs == null)
return;
try {
cs.sendMessage(sendMessage);
} catch (Exception e) {
System.out.print("发送消息失败!" + "\n");
}
}
private void getMessage() {
if (cs == null)
return;
DataInputStream inputStream = null;
try {
inputStream = cs.getMessageStream();
} catch (Exception e) {
System.out.print("接收消息缓存错误\n");
return;
}
try {
// 本地保存路径,文件名会自动从服务器端继承而来。
String savePath = "E:\\";
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int passedlen = 0;
long len = 0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(savePath)));
len = inputStream.readLong();
System.out.println("文件的长度为:" + len + "\n");
System.out.println("开始接收文件!" + "\n");
while (true) {
int read = 0;
if (inputStream != null) {
read = inputStream.read(buf);
}
passedlen += read;
if (read == -1) {
break;
}
// 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比
System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");
fileOut.write(buf, 0, read);
}
System.out.println("接收完成,文件存为" + savePath + "\n");
fileOut.close();
} catch (Exception e) {
System.out.println("接收消息错误" + "\n");
return;
}
}
public static void main(String arg[]) {
new ClientTest().getMessage();
}
}
测试是成功的,在DOS命令行下编译~~~
分享到:
相关推荐
SOCKET TCP 文件传输 客户端 服务器端 client svever 实现简易文件传输功能
Java Socket编程 PC端程序 用来传输文件 包括服务器、客户端
2..instant messaging:使用 Java Socket 编程可以实现即时通信和文件传输。 3.远程教育:使用 Java Socket 编程可以实现远程教育中的实时通信和数据传输。 四、Java Socket 编程的优点 Java Socket 编程有许多...
在本文中,我们将详细介绍如何使用 Java 的 Socket 编程实现一个简单的多线程 WEB 服务器。 Socket 编程简介 Socket 编程是 Java 网络编程的基础,它允许开发者创建客户端和服务器端的网络应用程序。Socket 是一种...
Java Socket 编程是计算机网络实验中的一个重要组成部分,它允许开发者创建可以在网络上传输数据的应用程序。下面是关于 Java Socket 编程在计算机网络实验中的应用的知识点总结。 Java Socket 编程简介 Java ...
Socket编程可以分为两个部分:客户端编程和服务器端编程。 1.1 客户端编程 在RemoteFileClient类中,我们创建了一个Socket对象,并使用其连接到RemoteFileServer。客户端编程的主要步骤包括: * 创建Socket对象 *...
客户端/服务器端编程是 Java 网络编程的核心技术之一。客户端/服务器端编程可以实现客户端和服务器端之间的通信、数据传输和资源共享等功能。客户端/服务器端编程可以使用 Socket 编程、HTTP 编程等技术来实现。 ...
本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java 网络编程是指使用 Java 语言...
6. TCP协议:TCP协议是一种面向连接的协议,能够保证传输数据的安全,应用十分广泛,例如下载文件、浏览网页等。 7. UDP协议:UDP协议是一种非面向连接的协议,效率高但是不安全。 8. IP地址:IP地址是互联网协议...
3. 服务器监听到客户端的连接请求,创建一个 Socket,与客户端进行通信。 4. 建立接收和发送两个缓存区,并打开 Socket 及其输入、输出流。 5. 根据协议读写 Socket 内容。 6. 通信结束后关闭 Socket。 服务器端...
一般的tcp网络编程分为客户端和服务器端,用Socket对象进行客户端与服务器端的数据交流,用IO流技术充当桥梁。本案例详细的阐述了这一过程。
1、本项目是使用Java socket 编程来模拟Ftp,严格按照M-V-C架构分包分类,并实现Swing界面,Ftp使用TCP端口21传输控制信息,使用TCP端口20来传输文件数据。 2、本项目默认使用TCP端口4321来传输控制信息,使用TCP...
"华科-计算机网络实验报告-Java_Socket编程-网络组建实验.docx" 这份实验报告主要涵盖了计算机网络实验的两个部分:Socket 编程和网络组建实验。下面是对这两部分的详细解释和知识点总结: Socket 编程 Socket ...
Java实现的Socket编程是基于TCP/IP协议的,它提供了一个可靠的数据流服务,可以实现客户端和服务器之间的数据交换。Java中的Socket类和ServerSocket类是两种基本的套接字类,Socket类用于建立客户端和服务器之间的...
在SOCKET编程实现聊天程序中,使用Java语言编写了一个简单的客户端和服务器端程序。服务器端使用ServerSocket来监听客户端的连接请求,而客户端使用Socket来连接服务器端。 在服务器端,使用BufferedReader和...
整个过程就是当一个客户端向服务器端发送一个请求(request),然后Web服务器返回一个响应(response),之后连接就关闭了,在服务器端此时是没有保存连接的信息。 在Java中,客户端和服务器端交互的实现是通过套接...
Socket编程:利用Java的Socket API实现客户端和服务器之间的通信,建立TCP连接进行数据传输。 文件流操作:使用Java的文件输入输出流(FileInputStream、FileOutputStream)读取和写入文件内容。 多线程处理:通过多...
这个代码实现了一个简单的文件传输服务器,可以接收客户端的连接请求并将指定的文件发送给客户端。主要使用了Java的网络编程和文件操作技术。 首先定义了一个FileTransferServer类,在main方法中创建了一个...
JAVA实现的socket 实现服务器和客户端之间的传输
在这里,我们介绍了 Java Socket 的基本使用方法,并实现了一个简单的 SMTP 客户端。通过这个示例,我们可以了解 Java Socket 的使用方法,并学习如何实现 SMTP 协议来发送邮件。 扩展阅读 * Java Socket 编程 * ...