Java网络编程(一)

今天主要用java写了一个传送消息和传送文件的一个程序。其实实际上还是和java的io打交道。大家要明白的是,socket也是一种文件描述符。学过unix的童鞋应该都知道,网络编程从管道,双向管道,通道,到socket通信,其实还是通过文件描述符来玩字节和字符。所以大家要把java io方面的东西弄清楚。


贴程序:


服务器端:

import java.io.*;
import java.net.*;


class Server{
public static void main(String[] args){
try{
ServerSocket server = new ServerSocket(8088);
Socket client = server.accept();


DataInputStream datastream = new DataInputStream(client.getInputStream());
System.out.println(datastream.readUTF());
DataOutputStream datastream2 = new DataOutputStream(client.getOutputStream());
datastream2.writeUTF("cao");
// datastream2.flush();
datastream2.writeUTF("ni");
// datastream2.flush();
datastream2.writeUTF("ma");

File file = new File("C:\\Users\\Yelbosh\\Desktop\\box2d.pdf");
byte[] tem = new byte[1024];
int progress = 0;
long  size = file.length();
datastream2.writeLong(size);
FileInputStream input = new FileInputStream(file);


while(progress < size){
int curr = input.read(tem);
datastream2.write(tem);
progress += curr;
System.out.println(progress);
}




server.close();
client.close();
}catch(Exception e){
System.out.println(e);
}
}
}


客户端:

import java.io.*;
import java.net.*;


class Client{
public static void main(String[] args){
try{
Socket socket = new Socket("localhost",8088);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());   
 
DataInputStream dis = new DataInputStream(socket.getInputStream());   

dos.writeUTF("I'm clients!!");   

System.out.println(dis.readUTF()); 
System.out.println(dis.readUTF());
System.out.println(dis.readUTF());  


File file = new File("C:\\Users\\Yelbosh\\Desktop\\box2d22222.pdf");
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);


long size = dis.readLong();
int progress = 0;
byte[] tem = new byte[1024];
int x;


while((x = dis.read(tem)) != -1){
ostream.write(tem);
progress += x;
System.out.println(progress);
}

socket.close();   
}catch(Exception e){
System.out.println(e);
}
}
}


注意serversocket的receive方法。javadoc上说是这么:

侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。

所以其内部实现其实是通过while循环来实现的。所以如果没有客户端连接的话那么服务器端会一直处于阻塞状态而不会退出。

但是有一个地方我不太明白的是,如果客户端分几次在socket的outputstream中进行写入的时候,为什么不能从服务器端一次性的读出。我不知道这个内部的实现原理是什么,归根结底是因为io方面学得不够扎实。弄清楚之后会告诉大家的。















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值