首页 文章 精选 留言 我的

精选列表

搜索[网络编程],共10010篇文章
优秀的个人博客,低调大师

Python网络编程(socketserver、TFTP云盘、HTTPServer服务器模型)

HTTP? HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。 通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS 默认HTTP的端口号为80,HTTPS的端口号为443。 what? 无状态什么鬼? HTTP无状态协议是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息, 则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快 由于web等客户端与服务器交互的应用程序出现后HTTP的无状态严重阻碍了这些应用的实现效率 说以就产生了cookie和Session cook

优秀的个人博客,低调大师

06.Java网络编程(java GUI实现的聊天界面)

目前测试存在两个问题 1.最初是继承Frame来实现界面显示,后来发现,界面中部分控件存在时而显示时而不显示的问题,查找资料之后,将Frame修为JFrame,并且修改setVisible的时机,界面显示的问题解决,不显示的原因,有一种说法就是注释中提到的 2.界面显示问题解决之后,目前接收消息的线程无法正常接收,导致震动功能也无法实现,原因还有待进一步排查 package com.ren.socket; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Panel; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.sql.Date; import java.text.SimpleDateFormat; import javax.swing.JFrame; /** * 先调整窗口大小才会显示出组件,而不是立马显示出组件,在组件还未添加到面板前就将窗口 * (JFrame)设为可见(setVisible()),控件并不会引发重绘。解决方法很简单, * 只需要等所有组件都准备好以后才将JFrame的setVisible()设置为true。 * 非要在调用setVisible()之后添加组件,那么你也可以这样做:getContentPane().invalidate(); * * 即便这样做了,也没有达到想要的效果 */ public class GUIChat_UDP extends JFrame{ private static final long serialVersionUID = 1L; private Button send; private Button log; private Button clear; private Button shake; private TextArea viewText; private TextArea sendText; private TextField tField; private DatagramSocket socket; private BufferedWriter writer; public GUIChat_UDP(){ Init(); southPanel(); centerPanel(); event(); getContentPane().invalidate(); } private void centerPanel() { Panel center = new Panel(); //显示的文本区域 viewText = new TextArea(); //发送的文本区域 sendText = new TextArea(); //设置为边界布局管理器 center.setLayout(new BorderLayout()); //发送的文本区域放在南边 center.add(sendText, BorderLayout.SOUTH); //显示区域放在中间 center.add(viewText, BorderLayout.CENTER); //设置不可以编辑 viewText.setEditable(false); //设置背景色 viewText.setBackground(Color.WHITE); //设置字体大小 sendText.setFont(new Font("xxx", Font.PLAIN, 15)); viewText.setFont(new Font("xxx", Font.PLAIN, 15)); //将这个panel设置在中间位置 this.add(center,BorderLayout.CENTER); } private void southPanel() { Panel south = new Panel(); //用于输入聊天对象的IP地址 tField = new TextField(15); tField.setText("127.0.0.1"); send = new Button("send"); log = new Button("log"); clear = new Button("clear"); shake = new Button("shake"); //添加如布局 south.add(tField); south.add(send); south.add(log); south.add(clear); south.add(shake); this.add(south, BorderLayout.SOUTH); } private void Init() { this.setLocation(500, 50); this.setSize(400,600); this.setVisible(true); //开启接收消息线程 new Receive().start(); try { //初始化发送码头 socket = new DatagramSocket(); writer = new BufferedWriter(new FileWriter("log.txt",true)); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void event() { //关闭按钮事件 this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { try { socket.close(); writer.close(); System.exit(0); } catch (Exception e2) { } } }); //发送按钮事件 send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { send(); } catch (IOException e1) { e1.printStackTrace(); } } }); //消息记录 log.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { logFile(); } catch (IOException e1) { e1.printStackTrace(); } } }); //清空屏幕 clear.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { viewText.setText(""); } }); //震动 shake.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { send(new byte[]{-1}, tField.getText()); } catch (IOException e1) { e1.printStackTrace(); } } }); //快捷键监听 sendText.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { //control+enter键发送消息 if (e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown()) { try { send(); } catch (Exception e2) { } } } }); } //通过不断改变界面在屏幕中的位置达到震动的效果 protected void shake() { int x = this.getLocation().x; int y = this.getLocation().y; for (int i = 0; i < 10; i++) { try { this.setLocation(x + 10, y + 10); Thread.sleep(20); this.setLocation(x + 10, y - 10); Thread.sleep(20); this.setLocation(x - 10, y + 10); Thread.sleep(20); this.setLocation(x - 10, y - 10); Thread.sleep(20); this.setLocation(x, y); } catch (Exception e) { } } } protected void logFile() throws IOException { //刷新缓冲区 writer.flush(); //读取消息记录文件 FileInputStream fis = new FileInputStream("log.txt"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int len; byte[] arr = new byte[8192]; while((len = fis.read(arr))!= -1){ baos.write(arr,0,len); } String log = baos.toString(); viewText.setText(log); fis.close(); baos.close(); } protected void send() throws IOException { String message = sendText.getText(); String ip = tField.getText(); ip = ip.trim().length() == 0?"255.255.255.255":ip; send(message.getBytes(),ip); String time = getCurrentTime(); String sendMessage = time+" 我对:"+(ip.equals("255.255.255.255")?"所有人":ip)+"说:\r\n "+message+"\r\n\r\n"; viewText.append(sendMessage); //将发送的消息写入文件 writer.write(sendMessage); sendText.setText(""); } private void send(byte[] bytes, String ip) throws IOException { DatagramPacket packet = new DatagramPacket (bytes,bytes.length,InetAddress.getByName(ip),9999); socket.send(packet); } private String getCurrentTime() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); return format.format(date); } //接收消息的线程 private class Receive extends Thread{ @Override public void run() { super.run(); try { DatagramSocket socket = new DatagramSocket(9999); DatagramPacket packet = new DatagramPacket(new byte[8192], 8192); while(true){ socket.receive(packet); byte[]arr = packet.getData(); int len = packet.getLength(); if (arr[0] == -1 && len == 1) { shake(); continue; } String message = new String(arr,0,len); String time = getCurrentTime(); String ip = packet.getAddress().getHostAddress(); String receivedMessage = time+" "+ip+"对我说:\r\n"+message+"\r\n"; viewText.append(receivedMessage); //写入收到的消息 writer.write(receivedMessage); } } catch (Exception e) { } } } public static void main(String[] args) { new GUIChat_UDP(); } }

优秀的个人博客,低调大师

Android网络编程——https 不验证证书方式(信任所有证书)

前面写了http的联网方式,Android平台上经常有使用https的需求,对于https服务器使用的根证书是受信任的证书的话,实现https是非常简单的,直接用httpclient库就行了,与使用http几乎没有区别。但是在大多数情况下,服务器所使用的根证书是自签名的,或者签名机构不在设备的信任证书列表中,这样使用httpclient进行https连接就会失败。解决这个问题的办法有两种,一是在发起https连接之前将服务器证书加到httpclient的信任证书列表中,这个相对来说比较复杂一些,很容易出错;另一种办法是让httpclient信任所有的服务器证书,这种办法相对来说简单很多,但安全性则差一些,但在某些场合下有一定的应用场景。这一篇主要实现httpclient信任所有的服务器证书。 直接给出代码: public class HttpsTestActivity extends Activity { /** Called when the activity is first created. */ private TextView text; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text=(TextView)findViewById(R.id.textView1); GetHttps(); } private void GetHttps(){ String https = "https://www.google.com.hk"; try{ SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[]{new MyTrustManager()}, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(new MyHostnameVerifier()); HttpsURLConnection conn = (HttpsURLConnection)new URL(https).openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.connect(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuffer sb = new StringBuffer(); String line; while ((line = br.readLine()) != null) sb.append(line); text.setText(sb.toString()); }catch(Exception e){ Log.e(this.getClass().getName(), e.getMessage()); } } private class MyHostnameVerifier implements HostnameVerifier{ @Override public boolean verify(String hostname, SSLSession session) { // TODO Auto-generated method stub return true; } } private class MyTrustManager implements X509TrustManager{ @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } } } 使用HttpsURLConnection时需要实现HostnameVerifier 和 X509TrustManager,这两个实现是必须的,要不会报安全验证异常。 /** * @author 张兴业 * 邮箱:xy-zhang#163.com * android开发进阶群:278401545 * */ 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230782,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS网络编程-解决iCloud文档存储过程中文档冲突问题

iCloud文档在保存的过程中难免会发生冲突,我们必须要有一套解决冲突的策略。策略的采用要根据用户的需求而定,有的简单有的复杂,最简单的是 直接使用当前版本覆盖冲突版本。复杂的策略,例如:如果是两个文本文件冲突,可以将两个冲突点列出来,让用户来判断再进行保存。 我们采用的策略是使用当前版本覆盖以前的版本。解决冲突首先需要在updateUbiquitousDocuments:方法中注册UIDocumentStateChangedNotification通知: //当iCloud中的文件变化时候调用 -(void)updateUbiquitousDocuments:(NSNotification*)notification{ …… if(_myCloudDocument){ //注册CloudDocument对象到文档协调者,文档状态变化才能收到通知 [NSFileCoordinatoraddFilePresenter:_myCloudDocument];① //注册文档状态变化通知 [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(resolveConflict:) name:UIDocumentStateChangedNotificationobject:nil];② } } //文档冲突解决 -(void)resolveConflict:(NSNotification*)notification{ if(_myCloudDocument &&_myCloudDocument.documentState==UIDocumentStateInConflict){③ NSLog(@”冲突发生”); //文档冲突解决策略 NSError*error; if(![NSFileVersionremoveOtherVersionsOfItemAtURL:_ myCloudDocument.fileURLerror:&error]){④ NSLog(@”移除其它的文档:%@”,[errorlocalizedFailureReason]); return; } _myCloudDocument.contents=_txtContent.text;⑤ [_myCloudDocumentupdateChangeCount:UIDocumentChangeDone];⑥ } [[NSNotificationCenterdefaultCenter]removeObserver:self name:UIDocumentStateChangedNotificationobject:nil];⑦ //从文档协调者中解除CloudDocument对象 [NSFileCoordinatorremoveFilePresenter:_myCloudDocument];⑧ 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1193879,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册