插播一条关于Socket编程的小程序,
2016-11-08 22:12
260 查看
socket编程是我们杨老师给我们最后一个上机实验,由于没有涉及到数据库,可能它的效率就没有那么高,就是简单的将线程和cs模式运用到一块,所以。写的有问题的地方还希望大神指出来:
话不多说,直接上代码:
服务端
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class SingleTalkServer {
class MultiTalkServerThread extends Thread implements ActionListener
{
private Frame f;
private Button sending,receiveing;
private TextField send;
private TextArea receive;
private PrintWriter out;
private BufferedReader in;
private String sinputLine, inputLine;
private String record;
boolean sinbye,inbye;
private Socket socket;
ServerSocket server;
private int clientNumber;
public MultiTalkServerThread(ServerSocket server,Socket socket, int clientNumber)
{
this.server = server;
this.socket = socket;
this.clientNumber = clientNumber;
}
public void run()
{
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} //auto flush
}
客户端
怎么说呢,这个如果在客户端加一个线程就不仅仅实现一对多的想法,就可以真正意义实现“群聊”的想法;但是由于没有数据库,那么真正意义群聊还是差点火候,但是模式是对的。学习不能只学习,还得思考。
话不多说,直接上代码:
服务端
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class SingleTalkServer {
public void handle() throws IOException{ ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.err.println("Could not listen on port: 4444."); System.exit(1); } Socket clientSocket = null; int clientNumber = 0; try { while(true){ clientSocket = serverSocket.accept(); //程序将在此等候客户端的连接 clientNumber++; //记录客户数目 new MultiTalkServerThread(serverSocket,clientSocket, clientNumber).start(); //创建一个新线程处理此客户请 } } catch (IOException e) { System.err.println("Accept failed."); System.exit(1); } System.out.println("Accept OK!"); } public static void main(String[] args )throws IOException{ new SingleTalkServer().handle(); } }
class MultiTalkServerThread extends Thread implements ActionListener
{
private Frame f;
private Button sending,receiveing;
private TextField send;
private TextArea receive;
private PrintWriter out;
private BufferedReader in;
private String sinputLine, inputLine;
private String record;
boolean sinbye,inbye;
private Socket socket;
ServerSocket server;
private int clientNumber;
public MultiTalkServerThread(ServerSocket server,Socket socket, int clientNumber)
{
this.server = server;
this.socket = socket;
this.clientNumber = clientNumber;
}
public void run()
{
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} //auto flush
sinbye = false; inbye = false; f=new Frame("qq server boss Test"); f.setSize(280,250); f.setLayout(new FlowLayout(FlowLayout.CENTER)); send=new TextField(80); receive=new TextArea(30,80); f.add(send); f.add(receive); sending = new Button("发送"); receiveing= new Button("关闭"); f.add(sending); f.add(receiveing); sending.addActionListener(this); receiveing.addActionListener(this); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); f.setBackground(Color.lightGray); f.setVisible(true); record=""; try { inputLine = in.readLine(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if(inputLine.equals("Bye.")) inbye=true; record=rec 4000 ord+"from Client: "+inputLine+"\n"; receive.setText(record); if(inbye){ sinbye=true; out.println("Bye."); out.flush(); } else send.setText("Server input:"); while( true ) { if( inbye == false ) { try { inputLine = in.readLine(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } record=record+"from Client: "+inputLine+"\n"; receive.setText(record); if (inputLine.equals("Bye.")) inbye = true; } if( sinbye == false ) { if(inbye){ out.println("Bye."); out.flush(); sinbye=true; } else send.setText("Server input:"); } if( sinbye == true && inbye == true ) break; } out.close(); try { in.close(); socket.close(); server.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } public void actionPerformed(ActionEvent e){ if(e.getSource()==sending){ if( sinbye == false ) { sinputLine=send.getText(); sinputLine=sinputLine.replace("Server input:",""); out.println(sinputLine); out.flush(); if (sinputLine.equals("Bye.")) sinbye = true; } } else if(e.getSource()==receiveing){ System.exit(0); } }
}
客户端
import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class SingleTalkClient implements ActionListener { private Frame f; private Button sending,receiveing; private TextField send; private TextArea receive; private PrintWriter out; private BufferedReader in; private BufferedReader stdIn; private String fromServer, fromUser; private String record; boolean sbye,ubye; public void actionPerformed(ActionEvent e){ if(e.getSource()==sending){ if(ubye==false){ fromUser=send.getText(); fromUser=fromUser.replace("Client input:",""); out.println(fromUser); out.flush(); if (fromUser.equals("Bye.")) ubye = true; } } else if(e.getSource()==receiveing){ System.exit(0); } } public void handle() throws IOException { Socket client = null; out = null; in = null; try { client = new Socket("127.0.0.1", 4444); out = new PrintWriter(client.getOutputStream(), true); //auto flush in = new BufferedReader(new InputStreamReader(client.getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: 127.0.0.1."); System.exit(1); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: 127.0.0.1."); System.exit(1); } //创建图形界面 f=new Frame("qq clinet boss Test"); f.setSize(280,250); f.setLayout(new FlowLayout(FlowLayout.CENTER)); send=new TextField(80); receive=new TextArea(30,80); f.add(send); f.add(receive); sending = new Button("发送"); receiveing= new Button("关闭"); f.add(sending); f.add(receiveing); sending.addActionListener(this); receiveing.addActionListener(this); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); f.setBackground(Color.lightGray); f.setVisible(true); record=""; send.setText("Client input:"); sbye = false; ubye = false; while( true ) { if( sbye == false ) { fromServer = in.readLine(); record=record+"from Server: "+fromServer+"\n"; receive.setText(record); if (fromServer.equals("Bye.")) sbye = true; } if( ubye == false ) { if(sbye){ out.println("Bye."); out.flush(); ubye=true; } else send.setText("Client input:"); } if( ubye == true && sbye == true ) break; } out.close(); in.close(); client.close(); } public static void main(String[] args) throws IOException { new SingleTalkClient().handle(); } }
怎么说呢,这个如果在客户端加一个线程就不仅仅实现一对多的想法,就可以真正意义实现“群聊”的想法;但是由于没有数据库,那么真正意义群聊还是差点火候,但是模式是对的。学习不能只学习,还得思考。
相关文章推荐
- 问一个关于java Socket编程的问题。
- Linux Socket编程实例(一个Hello World程序)
- ACE与ASIO之间关于Socket编程的比较
- C#关于socket同步编程
- Linux Socket编程bash服务程序
- 关于Socket编程
- Socket编程指南及示例程序
- Socket编程指南及示例程序
- [转]Socket编程指南及示例程序
- 关于Socket编程的一点思索
- 关于Socket编程中的地址组和协议组
- 关于socket编程
- Socket编程指南及示例程序
- 关于Socket编程项目之后经验谈
- Linux Socket编程实例(一个Hello World程序)
- 关于socket编程数据发送和接受的感受(wm和pc之间)
- ACE与ASIO之间关于Socket编程的比较
- socket编程指南及示例程序二(转载)
- ACE与ASIO之间关于Socket编程的比较[转]
- Net中的socket编程—聊天程序