用c/s结构做网络实验室,分别为老师和学生端,老师和学生端用socket进行通信老师端有启动的按钮,有如下方法
public void startService(){
try{
if(serverSocket==null){
serverSocket = new ServerSocket(8888,100);
System.out.println("服务器启动......监听8888端口");
//开启线程
server = new ServerListener(serverSocket,jList1,listModel1);
server.start();
}else{
System.out.println("服务器已经启动.....");
}
}catch(Exception e){
e.printStackTrace();
System.out.println("服务器启动错误");
}
}
当启动的时候开启线程,老师端阻塞,(多用户把socket放入数组)等待接收对象流,其中提供了socket的获取方法getSocket()下面为服务器线程:
public class ServerListener extends Thread {
ServerSocket server;
Socket socket =null;
User user;
JList jList1;
DefaultListModel listModel1;
public boolean isStop;
public ServerListener(ServerSocket server,JList jList1,DefaultListModel listModel1){
this.server = server;
this.jList1 = jList1;
this.listModel1 =listModel1;
isStop = false;
}
public void run(){
while(!isStop && !server.isClosed()){
try {
socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
user =(User) ois.readObject(); if(!listModel1.contains(user.getName())){
listModel1.addElement(user.getName());
jList1.setModel(listModel1);
}
} catch (EOFException e){
System.out.println("这是合法的,客户端已经关闭");
}catch (Exception e) {
try{
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
public Socket getSocket() {
return socket;
}
}
在ServerListener.java获取socket为的是在添加图片的时候获得这个socket进行数据的传送
在添加图片中也开启一个线程,下面为线程:public class ServerImage extends Thread {
private Socket socket;
private String path;
public ServerImage(Socket socket,String path) {
this.socket = socket;
this.path = path;
} public void run() {
try {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
//path为图片的路径
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[1024];
while(true){
int read =0;
if(fis!=null){
read = fis.read(b);
}
if(read == -1) break;
dos.write(b, 0, read);
}
dos.flush();
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }}
学生端当登陆的时候进行获取对象,学生端界面有个添加按钮,当点击添加按钮的时候把对象传给老师端,同时等待接受输入流获取图片进行加载,下面为学生端的线程:
public class ClientListener extends Thread {
Socket socket;
String ip;
int port;
User user;
JFrame jframe;
JLabel jLabel1;
ObjectOutputStream oos =null;
DataInputStream dis =null;
public ClientListener(Socket socket,String ip,int port,User user,JLabel jLabel1){
super();
this.socket = socket;
this.ip = ip;
this.port = port;
this.user =user;
this.jLabel1=jLabel1;
}
public void run(){
try{
oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
oos.writeObject(user);
oos.flush();
if(dis !=null){
File file = new File("d:\\clientimage\\new1.jpg");
byte[] b = new byte[1024];
FileOutputStream fos = new FileOutputStream(file);
while(true){
int write =0;
if(dis !=null){
write = dis.read(b);
}
if(write == -1) break;
fos.write(b, 0, write);
}
fos.flush();
fos.close();
jLabel1.setIcon(new ImageIcon("d:\\clientimage\\new1.jpg"));
System.out.println("----接收图片完毕--------");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
问题1
当老师端启动后,等待学生端的连接,如果学生端来连接,学生端把对象流输入到老师端,老师端进行获取对象,添加学生,当老师端界面点击加载图片按钮的时候,图片列表中有图片的名字,选择点击添加,进行传图片的操作,学生端开启的线程接收图片并加载,问题是学生端的发送和接收都写在一个线程里,意味着当点击一次添加老师的按钮的时候开启传送和等待接受,老师端如果添加图片2次,第2次就会出现socket is close的错误,也就是说要学生点击2次添加老师的按钮才能正常的接受2次的图片,这是个问题, 如何把学生端这种情况接收和发送分离,使服务器传图片的时候能够加载图片不影响有没有什么好方法(还是我写的不对)
问题2
学生端加载图片后,图片上有3个路由器要求能点击,如果换图片的话,如何能都进行动态的换telnet ip那,有没有什么好的方法和解决方案。
本人菜鸟,希望大侠们指教。
public void startService(){
try{
if(serverSocket==null){
serverSocket = new ServerSocket(8888,100);
System.out.println("服务器启动......监听8888端口");
//开启线程
server = new ServerListener(serverSocket,jList1,listModel1);
server.start();
}else{
System.out.println("服务器已经启动.....");
}
}catch(Exception e){
e.printStackTrace();
System.out.println("服务器启动错误");
}
}
当启动的时候开启线程,老师端阻塞,(多用户把socket放入数组)等待接收对象流,其中提供了socket的获取方法getSocket()下面为服务器线程:
public class ServerListener extends Thread {
ServerSocket server;
Socket socket =null;
User user;
JList jList1;
DefaultListModel listModel1;
public boolean isStop;
public ServerListener(ServerSocket server,JList jList1,DefaultListModel listModel1){
this.server = server;
this.jList1 = jList1;
this.listModel1 =listModel1;
isStop = false;
}
public void run(){
while(!isStop && !server.isClosed()){
try {
socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
user =(User) ois.readObject(); if(!listModel1.contains(user.getName())){
listModel1.addElement(user.getName());
jList1.setModel(listModel1);
}
} catch (EOFException e){
System.out.println("这是合法的,客户端已经关闭");
}catch (Exception e) {
try{
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
public Socket getSocket() {
return socket;
}
}
在ServerListener.java获取socket为的是在添加图片的时候获得这个socket进行数据的传送
在添加图片中也开启一个线程,下面为线程:public class ServerImage extends Thread {
private Socket socket;
private String path;
public ServerImage(Socket socket,String path) {
this.socket = socket;
this.path = path;
} public void run() {
try {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
//path为图片的路径
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[1024];
while(true){
int read =0;
if(fis!=null){
read = fis.read(b);
}
if(read == -1) break;
dos.write(b, 0, read);
}
dos.flush();
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }}
学生端当登陆的时候进行获取对象,学生端界面有个添加按钮,当点击添加按钮的时候把对象传给老师端,同时等待接受输入流获取图片进行加载,下面为学生端的线程:
public class ClientListener extends Thread {
Socket socket;
String ip;
int port;
User user;
JFrame jframe;
JLabel jLabel1;
ObjectOutputStream oos =null;
DataInputStream dis =null;
public ClientListener(Socket socket,String ip,int port,User user,JLabel jLabel1){
super();
this.socket = socket;
this.ip = ip;
this.port = port;
this.user =user;
this.jLabel1=jLabel1;
}
public void run(){
try{
oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
oos.writeObject(user);
oos.flush();
if(dis !=null){
File file = new File("d:\\clientimage\\new1.jpg");
byte[] b = new byte[1024];
FileOutputStream fos = new FileOutputStream(file);
while(true){
int write =0;
if(dis !=null){
write = dis.read(b);
}
if(write == -1) break;
fos.write(b, 0, write);
}
fos.flush();
fos.close();
jLabel1.setIcon(new ImageIcon("d:\\clientimage\\new1.jpg"));
System.out.println("----接收图片完毕--------");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
问题1
当老师端启动后,等待学生端的连接,如果学生端来连接,学生端把对象流输入到老师端,老师端进行获取对象,添加学生,当老师端界面点击加载图片按钮的时候,图片列表中有图片的名字,选择点击添加,进行传图片的操作,学生端开启的线程接收图片并加载,问题是学生端的发送和接收都写在一个线程里,意味着当点击一次添加老师的按钮的时候开启传送和等待接受,老师端如果添加图片2次,第2次就会出现socket is close的错误,也就是说要学生点击2次添加老师的按钮才能正常的接受2次的图片,这是个问题, 如何把学生端这种情况接收和发送分离,使服务器传图片的时候能够加载图片不影响有没有什么好方法(还是我写的不对)
问题2
学生端加载图片后,图片上有3个路由器要求能点击,如果换图片的话,如何能都进行动态的换telnet ip那,有没有什么好的方法和解决方案。
本人菜鸟,希望大侠们指教。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货