1.知识核心
- 两类传输协议:TCP;UDP
- 基于Socket的java网络编程
- 简单的Client/Server程序
- 支持多客户的client/server程序(多线程)
2.代码优化
- 我们代码是一对一。但是要一个服务端对应多个客户端。
- 则我们要服务端用多线程管理客户端。
- 技术:死循环等待客户端连接。生成socket,
- 通过socket启动一个线程,参数是一个socket,并通过集合加入socket,管理socket,(可以建立类管理)。线程就是管理客服端的需求。
- 聊天室:技术,就是集合管理socket,循环给每一个客户端发客户端的信息。
3.代码案例一对一
-
文件下载
-
客户端输出文件名。服务端给对应文件
-
思路:服务端得到文件名。找到文件。传文件字符数组
-
客户端得到字符数组,写入文件。完成下载文件
-
实现:服务端得到一个文件名,调用一个方法,得到字符数组。
-
后传给客户端
-
客户端调用一个方法,把字符数组写入一个新建文件。
-
代码
-
服务端:
-
`public class Server {
public static void main(String[] args) {
//服务器端的套接字定义
ServerSocket server=null;//服务器接收客户端的套接字
Socket socket=null;//输入流,输出流定义
DataOutputStream dataout=null;
OutputStream out=null;DataInputStream datain=null; InputStream in=null;
//创建服务器端的套接字,并且监听客户端
try {
server=new ServerSocket(4331);
System.out.println(“server:0000000000”);
socket=server.accept();//阻塞
System.out.println(“server:1111111111”);
System.out.println(socket);
} catch (IOException e) {
e.printStackTrace();
}try {
//接受数据
in=socket.getInputStream();
datain=new DataInputStream(in);
System.out.println(“server:2222222222”);
String clientread=datain.readUTF(); //阻塞
char[] buf=coputxt(clientread);
// String res = new String(buf,“UTF-8”);
// System.out.println(buf);
// System.out.println(res);//发送数据 out=socket.getOutputStream(); dataout=new DataOutputStream(out); String string=new String(buf); dataout.writeUTF(string);
} catch (IOException e) {
e.printStackTrace();
}//关闭资源
try {
server.close();
socket.close();
in.close();
datain.close();
out.close();
dataout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static char[] coputxt(String a) {
File file1=new File(a);
char[] buf1 = null;
try {
FileInputStream fileInputStream=new FileInputStream(file1);
FileReader reader=new FileReader(file1);
int size=(int)file1.length();
buf1=new char[size];
reader.read(buf1);
System.out.println(buf1);
// buf=new byte[size];
// fileInputStream.read(buf);
// String res = new String(buf,“UTF-8”);
// System.out.println(res);
fileInputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}return buf1;
}
}`
客户端: -
package com.gunjun.serverandclient;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* @author admin
*
*/
public class Client {
public static void main(String[] args) {
//客户端套接字定义
Socket mysocket=null;
//输入流,输出流定义
DataOutputStream dataout=null;
OutputStream out=null;
DataInputStream datain=null;
InputStream in=null;
//创建客户端套接字
try {
mysocket = new Socket("localhost",4331);
//mysocket = new Socket("127.0.0.1",4331);
//mysocket = new Socket("192.168.32.52",4331);
System.out.println("client:00000000");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
//写数据
out=mysocket.getOutputStream();
dataout=new DataOutputStream(out);
dataout.writeUTF("employee.txt");
//读数据
in=mysocket.getInputStream();
datain=new DataInputStream(in);
String serverread=datain.readUTF();
// System.out.println(serverread);
// byte[] bs = serverread.getBytes();
copytxt(serverread);
System.out.println(serverread);
} catch (IOException e) {
e.printStackTrace();
}
//关闭资源
try {
mysocket.close();
out.close();
dataout.close();
in.close();
datain.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void copytxt(String buf) {
File file1=new File("employeecopy.txt");
try {
// FileOutputStream fileOutputStream=new FileOutputStream(file1);
// fileOutputStream.write(buf);
// fileOutputStream.close();
FileWriter fileWriter=new FileWriter(file1);
fileWriter.write(buf);
fileWriter.close();
System.out.println(file1.length());
System.out.println(file1.getAbsolutePath());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4. 优化代码一对多。
public class Server {
public static void main(String[] args) {
ServerSocket server=null;
Socket socket=null;
try {
server=new ServerSocket(4331);
} catch (IOException e) {
e.printStackTrace();
}
//创建多个客户端
while(true)
{
try{
socket=server.accept();
System.out.println(socket);
}
catch(IOException e1)
{System.out.println("ERRO:"+e1);}
if(socket!=null)
{
ServerThread thread=new ServerThread(socket);
thread.start();
}
}
}
}
class ServerThread extends Thread
{
Socket socket=null;
String s=null;
DataOutputStream out=null;
DataInputStream in=null;
public ServerThread(Socket socket)
{
this.socket=socket;
}
public void run()
{
try{
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
while(true)
{
s=in.readUTF();// 通过使用in读取客户放入"线路"里的信息。堵塞状态,
//除非读取到信息。
System.out.println("服务器收到:"+s);
out.writeUTF("你说的数是:"+s);
Thread.sleep(5000);
}
}
catch(IOException e)
{ System.out.println(""+e);
}
catch(InterruptedException e){}
}
}