项目要求:两人能持续不断的通信,并附上时间,网名。
服务器能够记录双方通信内容,并记录IP地址和端口号。
服务器端:
package com.link;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket sso=new ServerSocket(9997);
System.out.println("--------------服务端启动-------------------");
List<Socket> list=new ArrayList<Socket>();
while(true){
Socket socket=sso.accept();
list.add(socket);
ThreadSocket ts=new ThreadSocket(socket,list);
ts.start();
}
}
}
package com.link;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;
public class ThreadSocket extends Thread {
Socket socket;
List<Socket> list;
public ThreadSocket(Socket socket, List<Socket> list) {
this.socket=socket;
this.list=list;
}
public void run() {
InputStream is;
OutputStream ost;
try {
while(true){
is=socket.getInputStream();
byte[] b=new byte[1024];
int len=is.read(b);
String st=new String(b,0,len);
System.out.println(socket.getInetAddress().getHostAddress()+socket.getPort()+st);
for (Socket c : list) {
ost=c.getOutputStream();
ost.write(st.getBytes());
ost.flush();//
//通过遍历所有的list成员,运用socket中的getOutputStream()方法(返回outputStream类型),
}//通过ost的write方法,括号中写入byte类型的字符数组参数到输出流中(通过string类型的getByte()方法,将字符串转化成byte类型的字符组)
// 通过这种形式实现一客户端对另一客户端聊天,双方能收到对方的内容,服务器也能收到内容,并通过Socket中的方法来实现得到IP地址和端口号;
}//但是 有个缺点:己方发出信息后,自己也能收到,重复了。
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
package com.link;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client01 {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket sc1=new Socket("localhost",9997);
System.out.println("1客户端启动");
Scanner sc=new Scanner(System.in);
System.out.println("请输入网名");
String name=sc.next();
ThreadReader tr=new ThreadReader(sc1.getInputStream());
ThreadWriter tw=new ThreadWriter(sc1.getOutputStream());
tr.setName(name);
tw.setName(name);
tr.start();
tw.start();
}
}
package com.link;
import java.io.IOException;
import java.io.InputStream;
public class ThreadReader extends Thread {
InputStream is;
public ThreadReader(InputStream is) {
this.is=is;
}
public void run() {
try {
while(true){
byte[] bt=new byte[1024];
int len=is.read(bt);
String st=new String(bt,0,len);
System.out.println(st);
}
e.printStackTrace();
}
}
}
package com.link;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class ThreadWriter extends Thread {
OutputStream os;
Scanner sc;
public ThreadWriter(OutputStream os) {
this.os=os;
this.sc=new Scanner(System.in);
}
SimpleDateFormat sdf=new SimpleDateFormat("HH/mm/ss/");
public void run() {
try {
while(true){
System.out.println("请输入信息:");
String str=sc.next();
String info=sdf.format(new Date())+" "+Thread.currentThread().getName()+"说:"+str;
os.write(info.getBytes());
os.flush();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}