我是一个初学者,编了个小练习。在编译时通过,在运行时出现在问题。望各位高人指点一二,在这谢过了!!!服务端import java.net.*;
import java.io.*;class NetServer{
public static void main(String []args) { try {
ServerSocket ss =new ServerSocket(8888);
while(true) {
Socket s = ss.accept();
System.out.print("A is client connect");
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
} } catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} }
}客户端:
import java.net.*;
import java.io.*;class Cline {
public static void main(String []args) {
String str = null;
DataInputStream dis = null;
DataOutputStream dos = null; try {
Socket s = new Socket("127.0.0.1",8888);
while(true) {
dis = new DataInputStream(System.in);
str = dis.readUTF();
dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
} } catch(Exception e) {
e.printStackTrace();
}
}
}运行时分别出现了下面的错误:
D:\java\netSocket>java NetServer
A is client connectjava.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at NetServer.main(NetServer.java:15)java.io.IOException: 存放體空間不足,無法處理此指令。
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.readFully(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at Cline.main(Cline.java:15)
import java.io.*;class NetServer{
public static void main(String []args) { try {
ServerSocket ss =new ServerSocket(8888);
while(true) {
Socket s = ss.accept();
System.out.print("A is client connect");
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
} } catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} }
}客户端:
import java.net.*;
import java.io.*;class Cline {
public static void main(String []args) {
String str = null;
DataInputStream dis = null;
DataOutputStream dos = null; try {
Socket s = new Socket("127.0.0.1",8888);
while(true) {
dis = new DataInputStream(System.in);
str = dis.readUTF();
dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
} } catch(Exception e) {
e.printStackTrace();
}
}
}运行时分别出现了下面的错误:
D:\java\netSocket>java NetServer
A is client connectjava.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at NetServer.main(NetServer.java:15)java.io.IOException: 存放體空間不足,無法處理此指令。
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.readFully(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at Cline.main(Cline.java:15)
解决方案 »
- 学习java一个半月以来的心得--给初学者的一些建议
- 关于JPanel的一个问题
- 深入浅出URL编码(今天在闲逛csdn发现一篇好文章,不敢独享)
- [Swing]如何设置文本框默认得到焦点
- 同志们,在不用代码生成器来创建swing程序时,一般都用那些Layout啊?swing中这么多Layout到底哪个好用,混淆中!
- 复制粘贴功能的问题(有代码)
- 大学辍学!为了做JAVA程序员。各位大虾给个建议啊。
- 怎样把父类中成员方法的返回值赋给子类成员变量?麻烦看下在下写的程序
- ByteArrayInputStream 如何转化成 String
- 请帮我解惑程序中的一些问题
- INSTANCE 变量是什么意思??
- 困扰了很久的一个问题
import java.net.*;
import java.io.*;class NetServer{
public static void main(String []args) { try {
ServerSocket ss =new ServerSocket(8888);
Socket s = ss.accept();
System.out.print("A is client connect");
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
dis.close(); } catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} }
}import java.net.*;
import java.io.*;class Cline {
public static void main(String []args) {
String str = null;
DataInputStream dis = null;
DataOutputStream dos = null; try {
Socket s = new Socket("127.0.0.1",8888);
dis = new DataInputStream(System.in);
dos = new DataOutputStream(s.getOutputStream());
str = dis.readUTF();
dos.writeUTF(str);
dos.close();
dis.close(); } catch(Exception e) {
e.printStackTrace();
}
}
}
拿dos来说,它被创建好后,应该是循环写到输出流中,既不是你刚开始写的循环的去new它,也不是你第二次写的不给它循环。
给你一段我写的接受端的代码,测试过的传送二进制文件的,根据这个去想想server发送端应该怎么写,原理差不多。因为只考虑功能,没有异常处理
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;public class Test {
private void connect() {
byte b[] = new byte[512];//缓冲区
int num = 0;
try {
Socket socket = new Socket("localhost", 7777);
InputStream is = socket.getInputStream();
FileOutputStream fw = new FileOutputStream("c:/new.pdf");
num = is.read(b); //读一下数据流
while (num != (-1)) { // 是否读完所有数据
fw.write(b, 0, num); // 将数据写往文件
num = is.read(b); // 继续从文件中读取数据
}
is.close();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.net.*;public class ChatServer {
public static void main(String[] args) {
boolean started = false;
try {
ServerSocket ss = new ServerSocket(8888);
started = true;
while(started) {
boolean bConnected = false;
Socket s = ss.accept();
System.out.println("a client connected!");
bConnected = true;
DataInputStream dis = new DataInputStream(s.getInputStream());
while(bConnected) {
String str = dis.readUTF();
System.out.println(str);
}
dis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}}
import java.net.*;public class ChatServer {
public static void main(String[] args) {
boolean started = false;
try {
ServerSocket ss = new ServerSocket(8888);
started = true;
while(started) {
boolean bConnected = false;
Socket s = ss.accept();
System.out.println("a client connected!");
bConnected = true;
DataInputStream dis = new DataInputStream(s.getInputStream());
while(bConnected) {
String str = dis.readUTF();
System.out.println(str);
}
dis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}}
import java.io.*;
import java.net.Socket;public class Cline {
private void connect() {
String str = null;
try {
Socket socket = new Socket("localhost", 8888);
InputStream is = socket.getInputStream();
FileOutputStream fw = new FileOutputStream("F:/javacode/new.txt");
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(fw);
str = dis.readUTF(); //读一下数据流
while (str != null) { // 是否读完所有数据
dos.writeUTF(str); // 将数据写往文件
str = dis.readUTF(); // 继续从文件中读取数据
}
dos.flush();
dos.close();
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
new Cline().connect();
}
}
import java.net.*;
import java.io.*;class NetServer{
public static void main(String []args) { try {
ServerSocket ss =new ServerSocket(8888);
OutputStream os = null;
FileInputStream fis = null;
DataInputStream dis = null;
DataOutputStream dos = null;
String str = null;
Socket s = ss.accept();
System.out.print("A is client connect");
fis = new FileInputStream("F:/javacode/Runnables.java");
os = s.getOutputStream();
dis = new DataInputStream(fis);
dos = new DataOutputStream(os);
str = dis.readUTF();
while( str != null) {
dos.writeUTF(str);
}
dos.flush();
dos.close();
dis.close(); } catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} }
}
这个例子里有用到多线程,最好有一定了解线程的使用,才看得明白。希望对你有所帮助吧。
import java.io.InputStream;
import java.net.Socket;public class AcceptFile { private void connect() {
byte b[] = new byte[512];
int num = 0;
try {
Socket socket = new Socket("localhost", 7777);
InputStream is = socket.getInputStream();
FileOutputStream fw = new FileOutputStream("c:/newjcl.pdf");
num = is.read(b);
while (num != (-1)) {// 是否读完所有数据
fw.write(b, 0, num);// 将数据写往文件
num = is.read(b);// 继续从文件中读取数据
}
is.close();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
AcceptFile af = new AcceptFile();
af.connect();
}
}
发送端:import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Test3 { public static void main(String args[]) {
int num = 0;
byte b[] = new byte[512];
try {
ServerSocket server = new ServerSocket(7777);
Socket socket = server.accept();
FileInputStream fis = new FileInputStream("c:/jcl.pdf");
OutputStream fos = socket.getOutputStream();
num = fis.read(b);
while (num != (-1)) {// 是否读完文件
fos.write(b,0,num);// 把文件数据写出网络缓冲区
fos.flush();// 刷新缓冲区把数据写往客户端
num = fis.read(b);//继续从文件中读取数据
}
fos.close(); } catch (Exception e) {
e.printStackTrace();
}
}
}
还是对这些类的方法没有理解。
import java.net.Socket;public class Cline {
private void connect() {
String str = null;
try {
Socket socket = new Socket("localhost", 8888);
InputStream is = socket.getInputStream();
FileOutputStream fw = new FileOutputStream("F:/javacode/new.txt");
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(fw);
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(fw);
你要这两句来干什么呢?
接收端需要做3件事
1、拿到对于接收端来说是 in 方向的流,即InputStream is = socket.getInputStream();整个流是从socket来的,这句话你就得到了。
2、把这个流写到文件,即FileOutputStream fw = new FileOutputStream("F:/javacode/new.txt");
3、怎么写呢? 当然是用循环写,吧in的内容,写到fw里面去!
这样就完成了。发送端要做什么?
1、把要发送的东西变成货物,即--流 fis = new FileInputStream("F:/javacode/Runnables.java");2、流要怎么送出去?当然是坐车,即OutputStream fos = socket.getOutputStream();fos就是汽车,但是汽车可能需要分批发送这些流。
3、把流扔进车里,即while循环部分,fos.flush();的意思就是“发车”,然后让下批货物上车
==========================================你写了一些不必要的东西,以上就是原理 和 我的代码和你的代码的对比
用dos = new DataOutputStream(os);dos.writeUTF(str);把文件的内容写出去。
在客户端也是用这两方法读取和把文件内容写到new.txt文件里去。你用的方法是按字节读取写,我用的是按字符串读写。在编译时通过,运行时却出现了这些错误:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at Cline.connect(Cline.java:14)
at Cline.main(Cline.java:29)A is client connectjava.io.EOFException
at java.io.DataInputStream.readFully(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at NetServer.main(NetServer.java:22)
import java.net.*;
import java.io.*;class NetServer{
public static void main(String []args) { try {
ServerSocket ss =new ServerSocket(8888);
OutputStream os = null;
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
BufferedWriter bw = null;
OutputStreamWriter osw = null;
String str = null;
Socket s = ss.accept();
System.out.print("A is client connect");
fis = new FileInputStream("F:/javacode/Runnables.java");
os = s.getOutputStream();
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
str = br.readLine();
while( str != null) {
bw.write(str,0,str.length());
bw.flush();
str = br.readLine();
} bw.close();
br.close(); } catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} }
}
import java.io.*;
import java.net.Socket;public class Cline {
private void connect() {
String str = null;
try {
Socket socket = new Socket("localhost", 8888);
InputStream is = socket.getInputStream();
FileOutputStream fw = new FileOutputStream("F:/javacode/new.txt");
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
OutputStreamWriter osw = new OutputStreamWriter(fw);
BufferedWriter bw = new BufferedWriter(osw);
str = br.readLine(); //读一下数据流
while (str != null) { // 是否读完所有数据
bw.write(str,0,str.length()); // 将数据写往文件
bw.flush();
str = br.readLine(); // 继续从文件中读取数据
} bw.close();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
new Cline().connect();
}
}