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

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

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

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值