JAVA中Socket服务端和客户端网络通讯简单案例

1 篇文章 0 订阅

一. 简单介绍下Socket的用途:

1.Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术

2.IP地址+端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础

3.Socket套接字:网络上具有唯一标识的IP地址和端口组合在一起才能构成唯一能识别的标识符套接字。

  Socket原理机制:

  通信的两端都有Socket

  网络通信其实就是Socket间的通信

  数据在两个Socket间通过IO传输

注:需要导一些jar包 

  

                新建一个日志文件

                      

                项目整体架构

               

二.下面上代码: 

1.服务端

package socket_work;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Logger;

import util.Log4jBean;

/**
 * 服务端
 * @author syp
 *
 */
public class Server2 extends Thread {
	public void run() {
		  for(int i=0;i<3;i++) {
			  try {
				this.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		  }	
		}
 public static void main(String[] args) throws IOException {
		         Log4jBean.logger.info("服务器正在启动,请稍后。。。");
		         Server2 s=new Server2();
		         s.run();
		        
		         //创建一个服务器端socket,指定绑定的端口号,并监听此端口
		         ServerSocket serverSocket = new ServerSocket(8080);
		         //调用accept()方法开始监听,等待客户端的连接
		         Log4jBean.logger.info("=====================================================");
		         Log4jBean.logger.info("============服务器已启动,等待客户端的连接===============");
		         Log4jBean.logger.info("=====================================================");
		         Socket socket = serverSocket.accept();
		         //获取输入流,并读取客户端信息
		         InputStream inp = socket.getInputStream();
		        //把字节流转换成字符流
		         InputStreamReader isr = new InputStreamReader(inp);
		         //为字符流增加缓冲区
		         BufferedReader bfr = new BufferedReader(isr);
		         String clientinfo = null;
		         int i=0;
		         while((clientinfo=bfr.readLine())!=null){//循环读取数据
		        	 System.out.println("此处为服务器                                                                \n "
		        	 		      + "      正在获取客户端对话                                                         \n"
		        	 		      + "      客户端请求信息为"+clientinfo);
		        	 String[ ] strs = clientinfo.split(";");
		         }
		         
		         socket.shutdownInput();//关闭输入流
		         //向客户端传递的信息
		         OutputStream ots = socket.getOutputStream();
		         PrintWriter pw = new PrintWriter(ots);
		         pw.write("==================欢迎登陆=====================");
		         pw.flush();
		         
		         //关闭资源
		         Log4jBean.logger.info("准备关闭资源");
		         pw.close();
		         ots.close();
		         bfr.close();
		         isr.close();
		         inp.close();
		         socket.close();
		         serverSocket.close();
		         
	  }
}

2.客户端

package socket_work;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import util.Log4jBean;

/**
 * 客户端
 * @author syp
 *
 */
public class Client {
	public static void main(String[] args) {
        try {
            //创建一个客户端socket,
            Socket socket = new Socket("localhost",8080);
            //向服务器端传递信息
            OutputStream ots = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(ots);
            Scanner input=new Scanner(System.in);
            Log4jBean.logger.info("==============================================================");
            Log4jBean.logger.info("===================欢迎进入登陆界面=============================");
            Log4jBean.logger.info("==============================================================");
            Log4jBean.logger.info("请输入您的用户名");
            String username=input.nextLine();
            Log4jBean.logger.info("请输入密码");
            String password=input.nextLine();
            pw.write(username+";"+password);
            pw.flush();
            Log4jBean.logger.info("开始关闭输出流");
            //关闭输出流
            socket.shutdownOutput();
            //获取服务器端传递的数据
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String info = null;
            while((info=br.readLine())!=null){
            	Log4jBean.logger.info("       此处为客户端                                                     \n"
            			            + "       正在等待服务器响应                                      \n"
            			            + "       服务器响应:"+info+"                  ");
            }
            //关闭资源
            Log4jBean.logger.info("准备关闭资源");
            br.close();
            isr.close();
            is.close();
            pw.close();
            ots.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

3.其中需要的一些工具类,如日志打印类及日志的配置文件

①.新建一个Log4jBean日志类

package util;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jBean {
	public static Logger logger = LogManager.getLogger(Log4jBean.class
			.getName());
}

②.新建日志配置文件log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <properties>
    <property name="logPath">log</property>
  </properties>
  
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
          	<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%F]-[%p]-%L %m%n " />
    </Console>  
    <RollingFile name="RollingFile" filename="${logPath}/log.log"
      filepattern="${logPath}/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%F]-[%p]-%L %m%n " />
      <Policies>
        <SizeBasedTriggeringPolicy size="10240kb"/>
      </Policies>	
       <DefaultRolloverStrategy max="20"/>
    </RollingFile>
    
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="Console" />
      <!-- <AppenderRef ref="LogFile" /> -->
      <AppenderRef ref="RollingFile" />
    </Root>
  </Loggers>
</Configuration>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉梦洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值