tcp程序设计--客户端获取服务器输入输出流

思路:

第一步:实例化一个ServerSocket对象(服务器套接字),用来等待网络上的请求(也就是等待来连接的套接字)

第二步:调用accept()方法,返回一个与客户端socket对象相连接的socket对象

第三步:服务器端socket对象使用getOutputStream方法获得的输出流将指向客户端socket对象使用getInputStream获得的输入流,反之亦然

服务器端代码:

 public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8001);
while (!ss.isClosed()) {
Socket s = ss.accept();
OutputStream ops = s.getOutputStream();
String str = "欢迎进入程序\n编写TCP服务器程序,"
+ "实现创建一个在8001端口上等待的ServerSocket"
+ "对象,当接收到一个客户机的连接请求后,"
+ "程序从与客户机建立了连接的Socket对象中获得输入输出"
+ "流。通过输出流向客户机发送信息。";
ops.write(str.getBytes()); //将字符串变成byte数组写入
ops.close();
s.close();
}
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

客户端代码:

 public class Client extends JFrame {

     private static final long serialVersionUID = 1L;
private JTextArea textArea;
private JTextField portField;
private JTextField hostField; public static void main(String args[]) { Client frame = new Client();
frame.setVisible(true);
} public Client() {
super();
setBounds(100, 100, 500, 212);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
getContentPane().add(panel, BorderLayout.NORTH); final JLabel label = new JLabel();
label.setText("连接主机:");
panel.add(label); hostField = new JTextField();
hostField.setText("localhost");
panel.add(hostField); final JLabel label_1 = new JLabel();
label_1.setText("端口:");
panel.add(label_1); portField = new JTextField();
portField.setText("8001");
panel.add(portField); final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
final String hostName = hostField.getText();
String portNum = portField.getText();
final int port = Integer.parseInt(portNum);
try {
final InetAddress host = InetAddress.getByName(hostName);//实例化对应主机的InetAddress对象
Socket socket = new Socket(host, port); //实例化socket
final InputStream is = socket.getInputStream(); //对应服务器端的getoutputstream
InputStreamReader reader=new InputStreamReader(is);
int data = 0;
while ((data=reader.read()) != -1) {
textArea.append((char)data+"");
}
} catch (Exception e1) {
textArea.append(e1.toString());
e1.printStackTrace();
}
}
});
button.setText("连接");
panel.add(button); final JScrollPane scrollPane = new JScrollPane();
getContentPane().add(scrollPane, BorderLayout.CENTER); textArea = new JTextArea();
textArea.setLineWrap(true); //自动换行
scrollPane.setViewportView(textArea);
}
}

结果如下:

备注:

BoxLayout 箱式布局
BoxLayout 可以把控件依次进行水平或者垂直排列布局,这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列,而 Y_AXIS 表示垂直排列。BoxLayout 的构造函数有两个参数,一个参数定义使用该 BoxLayout 的容器,另一个参数是指定 BoxLayout 是采用水平还是垂直排列

tcp程序设计--客户端获取服务器输入输出流的更多相关文章

  1. 2015/12/14 Python网络编程,TCP/IP客户端和服务器初探

    一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉.最近开始学习,才明白一些什么服务器和客户端的关系. 所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者 ...

  2. 客户端获取服务器SessionID (Asp.net SessionID)

    SessionID是客户端首次访问某个方法或页面, 并且这个方法中设置了Session["xxx"]=xx; 此时服务器返回的响应头(HttpResponse.Headers)中会 ...

  3. tcp/ip客户端与服务器

    单击“发送数据”把数据发送到指定IP地址的指定端口号 using System; using System.Collections.Generic; using System.ComponentMod ...

  4. WCF客户端获取服务器返回数据报错

    错误信息:An error occurred while receiving the HTTP response to http://127.0.0.1/SIHIS/Infection/PubExec ...

  5. go实现的简易TCP的客户端和服务器

    今天介绍golang版本的通信基础:基于TCP的客户端和服务器实现,参考书籍:The Way To Go 那时学习java的时候也是做过通信的,当时是socket编程,服务器监听某一个端口,然后客户机 ...

  6. Java实验四 TCP客户端和服务器的应用

    实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 4.对通信内容进行摘要计算并验证 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B ...

  7. asp.net mvc4 简单的服务器监控开发之C#获取服务器CPU、RAM、TCP等系统信息(上)

    一.背景 前段时间服务器出了点问题,加上学业愈来愈紧张,写博文分享的时间越来越少.虽然不是第一次在博客园上写经验,但是近期分享的博文得到了不少的朋友支持和指正,在这里内心非常感激和开心.希望以后能认真 ...

  8. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  9. nodejs向远程服务器发送post请求----融云Web SDK/客户端获取token

    最近要用到一个叫融云的及时通讯的SDK,在获取token这个步骤的时候有点卡顿,以防以后碰到类似的问题,再此记录一下. 客户端通过融云 SDK 每次连接服务器时,都需要向服务器提供 Token,以便验 ...

随机推荐

  1. jzoj3717

    #include<bits/stdc++.h> using namespace std; extern int main2(void) __asm__ ("main2" ...

  2. Python读取mdb文件以及shell检测

    最近写了两个python的脚本不过实际意义不是很大,就是想练练python写程序,一直研究web方面脚本写的少多了,还有C语言也用的少多了.现在有时间得多写写程序,别把以前学到的知识给忘了. 作者: ...

  3. 白帽hacker酷炫小技能大盘点!

    白帽子是谁? 他们与一行行代码打交道,在“0”和“1”的世界中寻找风险,在IT产业软硬件核心技术和代码等自主研发能力不足.安全防护手段滞后.地下黑客业务已形成产业链的背景下,我国网络安全正面临日益严峻 ...

  4. [Objective-C语言教程]Posing(29)

    Posing,顾名思义,意思是“冒充”,它跟categories类似,但本质上不一样,Posing存在的目的在于子类可以冒充父类,使得后续的代码无需把父类修改为子类,就可以很方便的让父类表现成子类的行 ...

  5. leetcode-77-组合

    题目描述: 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], ...

  6. 嵌入式C语言自我修养 05:零长度数组

    5.1 什么是零长度数组 顾名思义,零长度数组就是长度为0的数组. ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的.在ANSI C 中定义一个数组的 ...

  7. SparkSQL中的自定义函数UDF

    在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...

  8. JavaScript DOM编程艺术 笔记(四)

    DOM document   object model(map) 家谱树---节点树 父 子  兄弟 元素节点  <div> 文本节点  内容 属性节点   value  src getE ...

  9. LOJ2476. 「2018 集训队互测 Day 3」蒜头的奖杯 & LOJ2565. 「SDOI2018」旧试题(莫比乌斯反演)

    题目链接 LOJ2476:https://loj.ac/problem/2476 LOJ2565:https://loj.ac/problem/2565 题解 参考照搬了 wxh 的博客. 为了方便, ...

  10. webpack/gulp的z-index被改写

    webpack方法 new OptimizeCSSPlugin({ cssProcessorOptions: { safe: true } }) gulp-cssnano 方法 .pipe(cssna ...