简单的局域网通信,适合初学者。大神勿喷!

项目要求:两人能持续不断的通信,并附上时间,网名。

服务器能够记录双方通信内容,并记录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 list=new ArrayList();

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 list;


public ThreadSocket(Socket socket, List 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);
}

} catch (IOException e) {
 
   

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();
}
}

}

你可能感兴趣的:(Java,线程)