Java_socket程序学习03-一个客户端对一个服务器-交互(服务器端)--01

一个客户端对一个服务器-交互(服务器端)

这里我们阴郁了线程,一个线程处理输入,一个线程处理接收

此服务器还是只能接受一个客户端的链接,

                    即服务器能读取键盘的输入还能接受客户端的键盘输入结果

此代码为服务器的代码,实现了既能接收键盘的输入流也能接收客户端的输入流。

应为有两个输入流,而readLine()函数也是个阻断没有输入流将会等待

如果

键盘.readLine();

客户端.readLine();

放在主程序中顺序的执行,意味着接到键盘输入后才能接收客户端输入,颠倒也会出现此问题。很不合理

于是我们使用了线程。

一个线程处理键盘输入流

一个线程处理客户端输入流

注意以下几点:

1.主函数的变量不能被线程类读取到,所以线程需要的变量需要在线程类里面定义

如:

BufferedReader in = new BufferedReader(new InputStreamReader(socket01.getInputStream()));

BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));

PrintStream out=new PrintStream(socket01.getOutputStream());

本计划在主函数里定义,但是在线程类里用到in 、ins、out时提示没有定义,即读取不到主函数定义的变量

2.此程序把

Socket socket = ss.accept();//阻塞中,等待客户端介入

放到了主函数里面,线程子类需要PrintStream out=new PrintStream(socket01.getOutputStream());需要socket变量,

但是不能访问主函数,所以我们通过对线程类Syin和Soin的构造方法,来将参数socket传入到线程类里。

3.线程类Syin和Soin里都使用了死循环,反复的来调用readLine()来等待数据接收。

4.使用if来判断输入的数据是否是bb即byebye,从而来判断推出socket还是推出serversocket



package tcp;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;


public class ThreadServer {


/**
* @param args
*/
static int portNo=3333;
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(portNo);
System.out.println("The Server is start"+ss);

//当有客户端连接的时候 ,标记客户端为socket01
Socket socket = ss.accept();//阻塞中,等待客户端接入
System.out.println("Client is connected"+socket);

//socket客户端过来的输入流,原本位置是这里,但是下边的线程子类不认in,所以把它调到了线程里
//BufferedReader in = new BufferedReader(new InputStreamReader(socket01.getInputStream()));
//来自服务器自身的键盘输入流,记录键盘操作,原本位置是这里,但是下边的线程子类不认ins,所以把它调到了线程里
    //BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
    //向客户端方向的输出流
    //PrintStream out=new PrintStream(socket01.getOutputStream());
   
    //实例化两个线程类
    Syin sy = new Syin(socket);
    Soin so = new Soin(socket);
   
    sy.start();
    so.start();
    //socket.close();
    //ss.close();
}



//定义两个线程类1.class Syin键盘流处理 2.class Soin socket客户端流
public static class Syin extends Thread {
Socket socket01 ;
public Syin(){
     
}

public Syin(Socket a){
this.socket01=a;
System.out.print("服务器键");
};


public void run() {
try{
BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
PrintStream outs=new PrintStream(socket01.getOutputStream());
while(true){
String str_sy = ins.readLine();
       if(str_sy.equals("bb"))
        break;
System.out.println("盘的输入内容是:"+str_sy);
}
socket01.close();

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

};
}
//
public static class Soin extends Thread {
Socket socket01 ;
public Soin(){
     
}
public Soin(Socket b){
this.socket01=b;
System.out.print("来自客户");
};
public void run(){
try{
BufferedReader ins = new BufferedReader(new InputStreamReader(socket01.getInputStream()));
PrintStream outs=new PrintStream(socket01.getOutputStream());

while(true){
String str_sy = ins.readLine();
       if(str_sy.equals("bb"))
        break;
System.out.println("端的信息:"+str_sy);
}
socket01.close();
}catch (Exception e) 
           {
               e.printStackTrace();
           } 


};
}
}

深度学习是机器学习一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值