import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(8088);
//创建一个ServerSocket在端口8088监听客户请求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出错,打印出错信息
} Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客户请求,有客户
//请求到来则产生一个Socket对象,并继续执行
}catch(Exception e) {
System.out.println("Error."+e);
//出错,打印出错信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象 System.out.println("Client:"+is.readLine());
//在标准输出上打印从客户端读入的字符串
line=sin.readLine();
//从标准输入读入一字符串
while(!line.equals("bye")){
//如果该字符串为 "bye",则停止循环
os.println(line);
//向客户端输出该字符串
os.flush();
//刷新输出流,使Client马上收到该字符串
System.out.println("Server:"+line);
//在系统标准输出上打印读入的字符串
System.out.println("Client:"+is.readLine());
//从Client读入一字符串,并打印到标准输出上
line=sin.readLine();
//从系统标准输入读入一字符串
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
server.close(); //关闭ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
}
}这是单线程的
求解多线程。。
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(8088);
//创建一个ServerSocket在端口8088监听客户请求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出错,打印出错信息
} Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客户请求,有客户
//请求到来则产生一个Socket对象,并继续执行
}catch(Exception e) {
System.out.println("Error."+e);
//出错,打印出错信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象 System.out.println("Client:"+is.readLine());
//在标准输出上打印从客户端读入的字符串
line=sin.readLine();
//从标准输入读入一字符串
while(!line.equals("bye")){
//如果该字符串为 "bye",则停止循环
os.println(line);
//向客户端输出该字符串
os.flush();
//刷新输出流,使Client马上收到该字符串
System.out.println("Server:"+line);
//在系统标准输出上打印读入的字符串
System.out.println("Client:"+is.readLine());
//从Client读入一字符串,并打印到标准输出上
line=sin.readLine();
//从系统标准输入读入一字符串
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
server.close(); //关闭ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
}
}这是单线程的
求解多线程。。
解决方案 »
- Oracle中java存储过程java.security.AccessControlException
- JAVA高手帮忙,关于实现接口功能要用的哪些JAVA的类
- TH200打印图片
- 线程所在的线程组是如何确定的?
- 十万火急!!!问一个简单问题!!!
- 请问有没有关于弹球程序更好的算法?谢谢!!
- 关于Servlet所遇到的问题
- 利用jdom中的XPath 的时候出错了,请大侠指教
- 请问这段Code如何实现在BUTTON CLICK事件中改变BUTTON BACKCOLOR?
- 关于java自定义异常类问题
- java中为什么有final又要const?
- 这个程序打印的2006年日期和星期为什么对应不上啊。谢谢
你只给的server的代码啊 呵呵。
给你个思路吧,客户端用多线程的,在run里面 发送字符串和接受字符串,然后主函数里面建立线程对象,可以限制最大数量。服务器端每监听到一个线程就建立一个服务线程。
public Servicer(Socket s)
{
this.s=s;
}
public void run() {
// TODO Auto-generated method stub
try {
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader br=new BufferedReader(new
InputStreamReader(ips));
//pw有缓冲区
PrintWriter pw=new PrintWriter(ops,true);
String strline;
String strout;
while(true)
{ strline=br.readLine();
if(!strline.equalsIgnoreCase("esc"))
{
strout=new StringBuffer(strline).reverse().toString();// pw.flush();
pw.println(strline+"---->"+strout); }
else
break; }
br.close();
pw.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Server { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket ss=new ServerSocket(8088);
boolean buruning=true;
while(buruning)
{
Socket s=ss.accept();
new Thread(new Servicer(s)).start();
}
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }}
import java.net.*;public class TalkClient {
public static void main(String args[]) {
try {
Socket socket = new Socket("127.0.0.1", 8088); BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in)); PrintWriter os = new PrintWriter(socket.getOutputStream()); BufferedReader is = new BufferedReader(new InputStreamReader(socket
.getInputStream())); String readline;
readline = sin.readLine();
while (!readline.equals("bye")) { os.println(readline); os.flush(); System.out.println("Client:" + readline); System.out.println("Server:" + is.readLine()); readline = sin.readLine();
}
os.close();
is.close();
socket.close();
} catch (Exception e) {
System.out.println("Error" + e);
}
}
}
这个是客户端滴
服务器在获得客户端的连接请求之后他建一个 Socket对象,同时创建一个和客户端对话的线程,线程完成的主要功能是显示接收的信息,同进转换信息再进行对客户端的发送。
程序“ServerPoint.java”
import java.net.*;
import java.util.*;
import java.io.*;/**-----------------------------------
* <br>功能概述:服务器监听线程
------------------------------------*/
public class ServerPoint extends Thread{
static int SERVERPORT = 8088;public ServerPoint(){
}//ServerPoint()
public void run(){
ClientThread.log("服务器端程序启动....");
try{InetAddress ia = InetAddress.getLocalHost();
ClientThread.log("服务器的IP地址:" + ia.getHostAddress());
ServerSocket server = new ServerSocket (SERVERPORT);
//保持监听
while(true){
Socket client = server.accept();
//创造一个线程
ClientThread ct = new ClientThread(client);
ct.start();
}
}
catch( Exception e ){
ClientThread.log("服务器端程序关闭....");
System.exit(0);
}
}//run()public static void main(String arg[]){
ServerPoint sp = new ServerPoint();
sp.start();
}//main()
}/** ServerPoint *//**-----------------------------------
* <br>功能概述:实现和一个客户的对话线程
------------------------------------*/
class ClientThread extends Thread{
private Socket s;
public ClientThread(Socket s){
this.s = s;
}//ClientThread()public void run(){
try{
//接收消息流对象
BufferedReader brSocketReader = new BufferedReader(
new InputStreamReader(s.getInputStream()));
//发送消息流对象
PrintWriter pwSocketWriter = new PrintWriter(
new OutputStreamWriter(s.getOutputStream()),true);
String strGetMSG = brSocketReader.readLine();
log("客户端发送来的信息是:" + strGetMSG);
//发送反馈信息
pwSocketWriter.println(getFeedBackInfo(strGetMSG));brSocketReader.close();
pwSocketWriter.close();
s.close();
}
catch(Exception e){
e.printStackTrace();
}
}//run()static void log(String strInfo){
System.out.println(strInfo);
}//log()public String getFeedBackInfo(String strInfo){
String s = "";
for(int i=strInfo.length()-1;i>=0;i--){
s += String.valueOf(strInfo.charAt(i));
}
log("反馈信息是:" + s);
return s;
}//getFeedBackInfo()
}/** ClientThread */
客户端程序就是实现在jSendButton的动作事件发生之后。与服务器创建连接,然后发送jTexSendInfo文本域内的信息,并将接收的反馈信息显示在jTextGetInfo文本域内。
程序“ClientPoint.java”
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.awt.*;/**-----------------------------------
* <br>功能概述:客户端程序
------------------------------------*/
public class ClientPoint extends JFrame { //指定服务器套接口的地址和绑定端口号
static int SERVERPORT = 8088;
static String SERVERADDRESS = "192.168.1.109";
//界面编程部分
private JPanel jPanel1 = new JPanel();
private JTextField jTextSendInfo = new JTextField(25);
private JTextField jTextGetInfo = new JTextField(25);
private JButton jSendButton = new JButton("发送");
private JButton jClsButton = new JButton("清除"); public ClientPoint(){
super("客户端应用程序");
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
setSize(300,150);
jPanel1.add(jTextSendInfo);
jPanel1.add(jTextGetInfo);
jTextGetInfo.setEditable(false);
jPanel1.add(jSendButton);
jPanel1.add(jClsButton);
jSendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//发送信息,并获得反馈信息进行显示
MessageOperate();
}
});
jClsButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jTextSendInfo.setText("");
jTextGetInfo.setText("");
}
});
this.setContentPane(jPanel1);
}//ClientPoint() /**-----------------------------------
* <br>功能概述:实现发送信息,获得反馈信息进行显示
------------------------------------*/
public void MessageOperate(){
try{
Socket client = new Socket(SERVERADDRESS,SERVERPORT);
//接收消息流对象
BufferedReader brSocketReader = new BufferedReader(
new InputStreamReader( client.getInputStream()));
//发送消息流对象
PrintWriter pwSocketWriter = new PrintWriter(
new OutputStreamWriter(client.getOutputStream()),true);
//发送jTextSendInfo消息
pwSocketWriter.println(jTextSendInfo.getText());
//获得反馈信息
String strGetMSG = brSocketReader.readLine();
//显示反馈信息
jTextGetInfo.setText(strGetMSG);
brSocketReader.close();
pwSocketWriter.close();
client.close();
}
catch(Exception e){
e.printStackTrace();
}
}//MessageOperate()
/**-----------------------------------
* <br>功能概述:实现窗口关闭
------------------------------------*/
protected void processWindowEvent(WindowEvent e) {
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
//程序关闭
System.exit(0);
}
super.processWindowEvent(e);
}//processWindowEvent()
public static void main(String[] args) {
ClientPoint cp = new ClientPoint();
cp.show();
}//main()
}/** ClientPoint */