案例一:服务器收到客户端发送的信息,并打印到控制台
客户端
@Testpublic voidclient02(){
Socket socket=null;//造一个数据输出流
DataOutputStream dos=null;try{//造一个Socket套接字
socket=new Socket("127.0.0.1",4433);//数据输出流的输出位置是 socket的输出流
dos=newDataOutputStream(socket.getOutputStream());//给服务器传送数据
for(int i=0;i<1024;i++)
{//使用数据输出流输出基本数据类型数据
dos.writeUTF("我是客户端,你好服务器\n");
}
}catch(IOException e) {
e.printStackTrace();
}finally{//关闭资源
if (dos != null) {try{
dos.close();
}catch(IOException e) {
e.printStackTrace();
}
}if (socket != null) {try{
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
View Code
服务器
@Testpublic voidserver02()
{try{
ServerSocket serverSocket=new ServerSocket(4433);while (true)
{
Socket client=serverSocket.accept();
InputStream is=client.getInputStream();intlen;byte [] bytes=new byte[5];//不建议这样写,可能会乱码
while ((len=is.read(bytes))!=-1)
{
String str=new String(bytes,0,len);
System.out.println(str);
}
}
}catch(IOException e) {
e.printStackTrace();
}
}
View Code
服务器不建议这样直接读取数据,可能会乱码
我
是�
�户�
��,�
�好�
��务
器
推荐写法
@Testpublic voidserver02()
{try{
ServerSocket serverSocket=new ServerSocket(4433);while (true)
{
Socket client=serverSocket.accept();
InputStream is=client.getInputStream();intlen;byte [] bytes=new byte[5];
ByteArrayOutputStream bos=newByteArrayOutputStream();while ((len=is.read(bytes))!=-1)
{
bos.write(bytes,0,len);
}
String str=bos.toString();
System.out.println(str);
}
}catch(IOException e) {
e.printStackTrace();
}
}
View Code
我是客户端,你好服务器
我是客户端,你好服务器
我是客户端,你好服务器
...
补充:
Java ByteArrayOutputStream类
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
另外也可以使用转换流处理,效率较低
@Testpublic voidserver02()
{try{
ServerSocket serverSocket=new ServerSocket(4433);while (true)
{
Socket client=serverSocket.accept();
InputStream is=client.getInputStream();intlen;//方式二,使用转换流
InputStreamReader isr=newInputStreamReader(is);char [] cbuf=new char[5];while ((len=isr.read(cbuf))!=-1)
{for (int i=0;i
{
System.out.print(cbuf[i]);
}
}
}
}catch(IOException e) {
e.printStackTrace();
}
}
View Code
案例二:服务器收到客户端数据,并将数据回传给客户端
客户端
@Testpublic voidclient03()
{
Socket socket=null;
ByteArrayOutputStream bos=newByteArrayOutputStream();try{
socket=new Socket("127.0.0.1",4443);//发送数据给服务器
String str=new String("你好服务器,我是李华");byte[] strBytes =str.getBytes(StandardCharsets.UTF_8);
socket.getOutputStream().write(strBytes);//告诉服务器我已经发送完所有数据了
socket.shutdownOutput();//接受服务器回传数据
intlen;byte [] bytes=new byte[1024];while ((len=socket.getInputStream().read(bytes))!=-1)
{
bos.write(bytes,0,len);
}
System.out.println(bos.toString());
}catch(IOException e) {
e.printStackTrace();
}finally{//资源关闭
try{
bos.close();
}catch(IOException e) {
e.printStackTrace();
}if (socket != null) {try{
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
View Code
服务器
@Testpublic voidserver03()
{try{
ServerSocket serverSocket=new ServerSocket(4443);while (true)
{
ByteArrayOutputStream bos=newByteArrayOutputStream();
Socket client=serverSocket.accept();intlen;byte [] bytes=new byte[1024];while ((len=client.getInputStream().read(bytes))!=-1)
{
bos.write(bytes,0,len);
}
String str=bos.toString();
System.out.println(str);
String str1="我是服务器,我已经收到你的信息{"+str+"}";byte[] str1Bytes =str1.getBytes(StandardCharsets.UTF_8);
client.getOutputStream().write(str1Bytes);
client.shutdownOutput();
client.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
View Code
客户端
我是服务器,我已经收到你的信息{你好服务器,我是李华}
服务器
你好服务器,我是李华
案例三:客户端给服务器发送文件,服务器保存文件到本地,并把文件路径告诉客户端
客户端
@Testpublic voidclient04()
{try{
Socket socket=new Socket("127.0.0.1",4443);//读取文件并发送
File file=new File("hello.txt");
FileInputStream fis=newFileInputStream(file);intlen;byte [] buff=new byte[1024];while ((len=fis.read(buff))!=-1)
{
socket.getOutputStream().write(buff,0,len);
}
socket.shutdownOutput();//读取服务器发来的信息
buff=new byte[1024];
ByteArrayOutputStream baos=newByteArrayOutputStream();while ((len=socket.getInputStream().read(buff))!=-1)
{
baos.write(buff,0,len);
}
System.out.println(baos.toString());//关闭资源
baos.close();
fis.close();
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
View Code
服务器
@Testpublic voidserver04()
{try{
ServerSocket serverSocket=new ServerSocket(4443);while (true)
{
Socket client=serverSocket.accept();
String str=System.currentTimeMillis()+".txt";
File file=newFile(str);
FileOutputStream fos=newFileOutputStream(file);intlen;byte [] buff=new byte[1024];while ((len=client.getInputStream().read(buff))!=-1)
{
fos.write(buff,0,len);
}byte[] strBytes =str.getBytes(StandardCharsets.UTF_8);
client.getOutputStream().write(strBytes);
client.shutdownOutput();
client.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
View Code
客户端
1604033753035.txt
服务器