逐渐改吧,先这
么实现着。
服务器:
import java.net.Socket;
public class TcpIM {
public static void main(String[] args) {
// TODO Auto-generated method stub
SendThread sth=new SendThread();
sth.start();
Socket Soc=SocketUtil.BuildServerSocket(4211);
//SocketUtil.RecieveMessage(Soc);
/*
RecieveThread rth=new RecieveThread(Soc);
rth.start();
System.out.println("接收线程已运行");
*/
}
}
客户端:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Map;
import java.util.HashMap;
class SocketUtil{
public static Socket BuildServerSocket(int port) {
ServerSocket SerSoc=null;
Socket Soc=null;
try {
SerSoc=new ServerSocket(port);
while(true){
System.out.println("等待连接。。。");
Soc=SerSoc.accept();
System.out.println(Soc.getRemoteSocketAddress().toString()+"已连接到服务器!");
System.out.println(Soc.getPort());
pubVal.SocMap.put(Soc.getPort()+"",Soc);
SocketUtil.SendMessage(pubVal.SocMap.get(Soc.getPort()+""), "已连接至服务器:"+Soc.getLocalSocketAddress().toString());
SocketUtil.SendMessage(pubVal.SocMap.get(Soc.getPort()+""), "本机接口为:"+Soc.getPort());
RecieveThread rth=new RecieveThread(Soc);
rth.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Soc;
}
public static Socket BuildClientSocket(String SerIP,int port) {
Socket Soc=null;
try {
Soc=new Socket(SerIP,port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Soc;
}
public static String RecieveMessage(Socket Soc) {
String Message=null;
try {
byte[] buf=new byte[4096];
int len=0;
InputStream in=Soc.getInputStream();
while((len=in.read(buf))!=-1) {
Message=new String(buf,0,len);
System.out.println(Message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Message;
}
public static int SendMessage(Socket Soc,String StrMessage) {
int flag;
try {
OutputStream out=Soc.getOutputStream();
out.write(StrMessage.getBytes());
flag=1;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag=0;
}
return flag;
}
}
Socket类
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class TcpIMClient {
public static void main(String[] args) {
// TODO Auto-generated method stub
Socket Soc=SocketUtil.BuildClientSocket("192.168.1.100",4211);
RecieveThread rth=new RecieveThread(Soc);
rth.start();
String StrMessage="";
Scanner Scan=new Scanner(System.in);
while(true) {
System.out.println("按回车发送2:");
StrMessage=Scan.nextLine();
//String strPort=StrMessage.substring(StrMessage.indexOf('@')+1,StrMessage.indexOf(' '));
//System.out.println(strPort);
//Soc=pubVal.SocMap.get(strPort);
//SocketUtil.SendMessage(Soc, StrMessage);
SocketUtil.SendMessage(Soc,StrMessage);
}
}
}
/*
class RecieveThread extends Thread{
private Socket Soc;
public RecieveThread(Socket ClientSoc) {
Soc=ClientSoc;
}
public void run() {
SocketUtil.RecieveMessage(Soc);
}
}
*/
线程类:
import java.net.Socket;
class RecieveThread extends Thread{
private Socket Soc;
public RecieveThread(Socket ClientSoc) {
Soc=ClientSoc;
}
public void run() {
SocketUtil.RecieveMessage(Soc);
}
}
import java.net.Socket;
import java.util.Scanner;
public class SendThread extends Thread{
//private Socket Soc;
//public SendThread(Socket ClientSoc) {
//Soc=ClientSoc;
//}
public void run() {
Socket Soc;
String StrMessage="";
Scanner Scan=new Scanner(System.in);
while(true) {
System.out.println("按回车发送1:");
StrMessage=Scan.nextLine();
//System.out.println(StrMessage.indexOf('@')+" "+StrMessage.indexOf(' '));
if(StrMessage.indexOf('@')==0 && StrMessage.indexOf(' ')>0) {
String strPort=StrMessage.substring(StrMessage.indexOf('@')+1,StrMessage.indexOf(' '));
//System.out.println(strPort);
Soc=pubVal.SocMap.get(strPort);
if(null!=Soc) {
SocketUtil.SendMessage(Soc, StrMessage);
}else {
System.out.println("端口号制定错误!"+strPort+" 不存在");
}
}else {
System.out.println("没有指定发送接口");
}
}
}
}
全局变量:
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class pubVal {
static Map<String,Socket> SocMap=new HashMap<String,Socket>();
}