Java知识整理(十)之SE.TCP通信(Server和Client源代码)

Socket(套接字):用于描述IP地址和端口,每个服务软件都打开了一个Socket,并绑定到一个端口上。Socket和ServerSocket(用于服务器)类位于java.net包
获取本地地址和端口号:int getLocalPort();String getHostAddress();InetAddress getLocalAddress();
获取网络输入输出流:
Socket相当于一个邮箱,pw.println();把信放到邮箱;br.readLine();从邮箱拿信;
使用Socket完毕后使用void close()方法关闭(会同时关闭输入输出流)


服务器端(Server):创建监听服务-->等待连接--->进行通讯--->关闭连接
public class Server{
private ServerSocket server;
private List<PrintWriter> allOut;
public Server(){
try{
allOut = new ArrayList<PrintWriter>();
server = new ServerSocket(8088);
}catch(Exception e){
e.printStackTrace();
}
}
private synchronized void addOut(PrintWriter pw){
allOut.add(pw);
}
private synchronized void removeOut(PrintWriter pw){
allOut.remove(pw);
}
private synchronized void sendMessageToAllClient(String message){
for(PrintWriter pw:allOut){
pw.println(message);
}
}
public void start(){
try{
while(true){
System.out.println("等待客户端连接....");
Socket socket = server.accept();
ClientHandle clientHandle = new ClientHandle(socket);
Thread t = new Thread(clientHandle);
t.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Server server = new Server();
server.start();
}
private class ClientHandle implements Runnable{
private Socket socket;
private String host;
public ClientHandle(Socket socket){
this.socket=socket;
InetAddress address = socket.getInetAddress();
host = address.getHostAddress();
System.out.println(host+"上线了");
}
public void run(){
PrintWriter pw = null;
try{
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
pw = new PrintWriter(osw,true);
addOut(pw);


InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println(host+"说:"+s);
}


}catch(Exception e){
e.printStackTrace();
}finally{
try{
removeOut(pw);
socket.close();
System.out.println(host+"下线了!");


}catch(IOException e){
e.printStackTrace();
}


}
}


}


}


客户端(Client):连接服务器-->进行通讯-->关闭连接
public class Client{
private Socket socket = new Socket();
public Client(){
try{
socket = new Socket("127.0.0.1",8088);
}catch(Exception e){
e.printStackTrace();
}
}
public void start(){
try{
ServerMessage message = new ServerMessage();
Thread t = new Thread(message);
t.start();
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
PrintWriter pw = new PrintWriter(osw,true);
pw.println("服务端你好!");
Scanner sc = new Scanner(System.in);
while(true){
pw.println(sc.nextLine());
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Client client = new Client();
client.start();
}
private class ServerMessage implements Runnable{
public void run(){
try{
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String s = null;
while((s=br.readLine())!=null){
System.out.println("服务器说"+s);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值